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;
}

输出:


二、分析与总结

静态联编在编译时确定函数调用方式,效率高,但不适用于多态情况。

动态联编在运行时确定函数调用方式,适用于多态情况,通过虚函数实现。动态联编提供了更灵活的调用方式,但会带来一定的性能开销。
动态多态产生条件:

①先有继承关系

②父类中有虚函数,子类重写父类中的虚函数

③父类的指针或引用 指向子类的对象

相关推荐
疋瓞31 分钟前
C++_win_QT6学习《3》_结合qt项目开发学习git仓库相关知识
c++·qt·学习
minji...1 小时前
Linux 基础IO(一) (C语言文件接口、系统调用文件调用接口open,write,close、文件fd)
linux·运维·服务器·网络·数据结构·c++
第二只羽毛1 小时前
C++ 高性能编程要点
大数据·开发语言·c++·算法
Clarence Liu1 小时前
redis学习 (1) 基础入门
数据库·redis·学习
qq_571099351 小时前
学习周报二十五
学习
崇山峻岭之间1 小时前
C++ Prime Plus 学习笔记027
c++·笔记·学习
赖small强2 小时前
【Linux C/C++开发】Linux C/C++ 堆栈溢出:原理、利用与防护深度指南
linux·c语言·c++·stack·堆栈溢出
爱学习的梵高先生2 小时前
C++:基础知识
开发语言·c++·算法
oioihoii2 小时前
C++对象生命周期与析构顺序深度解析
java·开发语言·c++
xlq223222 小时前
24.map set(下)
数据结构·c++·算法