• C++学习Day07之动态联编和静态联编



    一、程序及输出

    C++ 中的联编(Binding)分为动态联编(Dynamic Binding)和静态联编(Static Binding)两种方式。它们分别指的是在运行时和编译时确定函数或方法的调用方式的过程。

    1.1 静态联编(Static Binding)

    静态联编是指在编译时确定函数或方法的调用方式。在编译阶段,编译器根据调用函数或方法的类型和参数类型来确定要调用的具体函数或方法。静态联编是通过函数名和参数类型来进行匹配的。静态联编通常用于普通的函数调用和非虚函数的调用。

    #include
    using namespace std;
    
    class Animal
    {
    public:
    	void speak()
    	{
    		cout << "动物在说话" << endl;
    	}
    
    	void eat(int a )
    	{
    		cout << "动物在吃饭" << endl;
    	}
    };
    
    class Cat :public Animal
    {
    public:
    	void speak()
    	{
    		cout << "小猫在说话" << endl;
    	}
    
    	void eat(int a)
    	{
    		cout << "小猫在吃饭" << endl;
    	}
    };
    void doSpeak(Animal & animal) //Animal & animal = cat;
    {
    	//如果地址早就绑定好了,地址早绑定,属于静态联编
    	//如果想调用小猫说话,这个时候函数的地址就不能早就绑定好,而是在运行阶段再去绑定函数地址,属于地址晚绑定,叫动态联编
    	animal.speak(); 
    
    }
    
    void test01()
    {
    	Cat cat;
    	doSpeak(cat);
    }
    int main(){
    	test01();
    	system("pause");
    	return EXIT_SUCCESS;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    输出:
    在这里插入图片描述

    1.2 动态联编(Dynamic Binding)

    动态联编(Dynamic Binding): 动态联编是指在运行时确定函数或方法的调用方式。在运行时,根据对象的实际类型来确定要调用的函数或方法。动态联编通过虚函数实现,即在基类中将要动态联编的函数声明为虚函数,派生类中重写这个虚函数。在调用时,根据对象的实际类型来确定调用的函数。

    #include
    using namespace std;
    
    class Animal
    {
    public:
    	//虚函数
    	virtual void speak()
    	{
    		cout << "动物在说话" << endl;
    	}
    
    	virtual void eat(int a )
    	{
    		cout << "动物在吃饭" << endl;
    	}
    };
    
    class Cat :public Animal
    {
    public:
    	void speak()
    	{
    		cout << "小猫在说话" << endl;
    	}
    
    	void eat(int a)
    	{
    		cout << "小猫在吃饭" << endl;
    	}
    };
    //动态多态产生条件:
    //先有继承关系
    //父类中有虚函数,子类重写父类中的虚函数
    //父类的指针或引用  指向子类的对象
    
    //对于有父子关系的两个类  指针或者引用 是可以直接转换的
    void doSpeak(Animal & animal) //Animal & animal = cat;
    {
    	//如果地址早就绑定好了,地址早绑定,属于静态联编
    	//如果想调用小猫说话,这个时候函数的地址就不能早就绑定好,而是在运行阶段再去绑定函数地址,属于地址晚绑定,叫动态联编
    	animal.speak(); 
    
    }
    
    void test01()
    {
    	Cat cat;
    	doSpeak(cat);
    }
    int main(){
    	test01();
    	system("pause");
    	return EXIT_SUCCESS;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    输出:
    在这里插入图片描述


    二、分析与总结

    静态联编在编译时确定函数调用方式,效率高,但不适用于多态情况。
    动态联编在运行时确定函数调用方式,适用于多态情况,通过虚函数实现。动态联编提供了更灵活的调用方式,但会带来一定的性能开销。
    动态多态产生条件:
    ①先有继承关系
    ②父类中有虚函数,子类重写父类中的虚函数
    ③父类的指针或引用 指向子类的对象

  • 相关阅读:
    SpringBoot系列之MongoDB分页接口实现
    latex左侧大括号 latex中大括号多行公式
    微信小程序的在线课外阅读打卡记录系统uniapp
    springBoot中starter
    16个值得推荐的.NET ORM框架
    【VRP问题】基于蚁群算法求解配送路径最短问题附matlab代码
    手把手教你深度学习和实战-----卷积神经网络
    网络工程师----第三十六天
    git上传代码冲突
    《Vue.js实战》8.1自定义指令答案
  • 原文地址:https://blog.csdn.net/qq_45649553/article/details/136183300