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

输出:


二、分析与总结

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

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

①先有继承关系

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

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

相关推荐
圆头猫爹24 分钟前
第34次CCF-CSP认证第4题,货物调度
c++·算法·动态规划
十五年专注C++开发35 分钟前
hiredis: 一个轻量级、高性能的 C 语言 Redis 客户端库
开发语言·数据库·c++·redis·缓存
hi0_61 小时前
03 数组 VS 链表
java·数据结构·c++·笔记·算法·链表
碧海蓝天20222 小时前
C++法则21:避免将#include放在命名空间内部。
开发语言·c++
CodeWithMe2 小时前
【读书笔记】《C++ Software Design》第一章《The Art of Software Design》
开发语言·c++
Wy. Lsy3 小时前
Kotlin基础学习记录
开发语言·学习·kotlin
The_Killer.3 小时前
格密码--数学基础--06对偶空间与对偶格
学习·线性代数·密码学
Tanecious.3 小时前
C++--红黑树
开发语言·c++
彤银浦4 小时前
Web学习笔记3
前端·笔记·学习·html5
之歆4 小时前
Python-魔术方法-创建、初始化与销毁-hash-bool-可视化-运算符重载-容器和大小-可调用对象-上下文管理-反射-描述器-二分-学习笔记
笔记·python·学习