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

目录


一、程序及输出

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

1.1 静态联编(Static Binding)

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

c 复制代码
#include<iostream>
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 动态联编(Dynamic Binding)

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

c 复制代码
#include<iostream>
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 小时前
RAG学习第一节
学习
知识分享小能手1 小时前
MongoDB入门学习教程,从入门到精通,MongoDB入门指南 —— 知识点详解(2)
数据库·学习·mongodb
Jordannnnnnnn1 小时前
追赶33名
c++
会编程的土豆1 小时前
【数据结构与算法】最短路径---Dijkstra 算法
数据结构·c++·算法
2401_879693871 小时前
C++中的观察者模式实战
开发语言·c++·算法
炽烈小老头1 小时前
【 每天学习一点算法 2026/03/24】寻找峰值
学习·算法
William_wL_1 小时前
【C++】string的实现
c++
fff9811182 小时前
C++与Qt图形开发
开发语言·c++·算法
Nan_Shu_6142 小时前
学习:Cesium (3)
学习
计算机安禾2 小时前
【数据结构与算法】第3篇:C语言核心机制回顾(二):动态内存管理与typedef
c语言·开发语言·数据结构·c++·算法·链表·visual studio