zoukankan      html  css  js  c++  java
  • 【CPP-NOTE】动态联编

    多态中动态联编特性

    联编是指一个计算机程序的不同部分彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。

    源代码中的函数调用解释为执行特定的函数代码被称为函数名联编(binding).

      在编译过程中进行联编被称为静态联编(static binding),又称早期联编(early binding).
      编译器必须生成能够在程序运行时选择正确的虚方法的代码,这被称为动态联编(dynamic binding), 又称为晚期联编(late binding).
          1.为什么有两种类型的联编以及为什么默认为静态联编?
          如果动态联编让您能够重新定义类方法,而静态联编在这方面很差,为何摒弃静态联编呢?原因有两个-----效率和概念模型.
          首先来看效率.为使程序能够在运行阶段进行决策,必须采取一些方法来跟踪基类指针或引用指向的对象类型,这增加了额外的开销.例如,如果类不会用作基类,则不需要动态联编.同样,如果派生类不重新定义基类的任何方法,也不需要使用动态联编.在这些情况下,使用静态联编更合理,效率也更高.由于静态联编的效率更高,因此被设置为C++的默认选择.Strousstrup说,C++的指导原则之一是, 不要为不使用的我付出代价(内存或者处理时间).仅当程序设计确实需要虚函数时,才使用它们

      • 成员函数必须声明为virtual,即为虚函数,该函数是动态联编
      • 动态联编:联编工作出现在运行时阶段,这种联编又称为晚期联编;
      • 编译程序:在编译阶段并不能确切知道将要调用的函数,只有在程序运行时才能确定将要调用的函数,为此要确切知道该调用的函数,要求联编工作要在程序运行时进行; 
        注:这样的好处是实现多态性和比较灵活,但是就要牺牲速度,因为每个函数调用在运行前是不可确定的,要随着用户的操作来执行相应的函数,相应地大大增加了系统的开销。
    #include <iostream>
    
    using namespace std;
    class father
    {
    public:
        father(){}
        ~father(){}
    public:
        virtual void run() const{cout<<"父亲可以跑1万米"<<endl;}
    };
    class son : public father
    {
    public:
        son(){}
        virtual ~son(){}
    public:
        void run() const{cout<<"儿子亲可以跑十万米"<<endl;}
    };
    int main()
    {
        father f;
        son s;
        f.run();
        s.run(); // 
        f=s;
    	f.run(); //输出还是父亲可以跑1万米 
        father *q=&s; 
        q->run();//指针调用,引用的是 派生类的对象,输出儿子; 
    	 
        system("pause");
        return 0;
    }
    

      

    雄关不惧 成败自含香
  • 相关阅读:
    还是火柴排队(补一下归并排序的锅)
    火柴排队(NOIP2013)(附树状数组专题讲解(其实只是粗略。。。))
    转圈游戏(NOIP2013)
    接口和多态
    HttpClient-传入url得到json字符串( PostMethod method = new PostMethod(url)是个好方法)
    url和资源的再理解
    每天进步一点点- 资源与URI(吐血精华总结)
    每天进步一点点-一切皆对象/一次编写,到处运行/bean工厂
    java黑魔法-反射机制-02-通过Java反射调用其他类方法
    java黑魔法-反射机制-01
  • 原文地址:https://www.cnblogs.com/cswangchen/p/7892325.html
Copyright © 2011-2022 走看看