C++虚函数的实现原理
静态联编与动态联编
1. 函数名联编:将源代码中的函数调用解释为执行特定的函数代码块,联编方式分为静态联编和动态联编
2. 静态联编是指编译器在编译过程中进行联编,动态联编是指编译器必须生成能够在程序运行时选择正确虚方法的代码
3. 对于非虚函数编译器使用静态联编,对于虚函数编译器使用动态联编
4. 静态联编效率更高,因此被设置为C++的默认选择
指针与引用的兼容性
1. C++不允许将一种类型的指针或引用赋值给另一种类型的指针或引用,如double d = 10.5; int * ptr = &d;
是不允许的
2. C++中可以将派生类的指针或引用转换为基类的引用或指针,即可以使用基类的指针或引用来指向派生类对象,称为向上转换,同时这种向上转换特性是可以传递的
3. C++中将基类的指针或引用转换为派生类的指针或引用称为向下转换,向下转换是不被允许的
虚函数工作原理
1. 编译时,由编译器创建虚函数表,编译器给每个包含虚函数的类创建一个虚函数表(vtable),虚函数表中的元素存放该类中所有虚函数的地址
2. 创建类对象时,编译器为每个包含虚函数的类对象提供了一个虚函数表指针(vptr),虚函数表指针指向该对象所属类的虚函数表
3. 程序运行时根据对象的类型初始化虚函数表指针,使之指向所属类的虚函数表,从而在调用虚函数时,就能够找到正确的函数
4. 虚函数表是由编译器自动创建和维护的,每个包含虚函数的类对象都会有一个虚函数表指针,即虚函数表是和类对应的,而虚函数表指针是和类对象对应的
5. 虚函数表指针通常作为第一个类成员被初始化,由编译器自动进行初始化操作
class Brass
{
public:
virtual void Withdraw()
{
cout << "Brass::Withdraw " << endl;
}
virtual ~Brass()
{
cout << "~Brass() " << endl;
}
};
class BrassPluse : public Brass
{
public:
void Withdraw()
{
cout << "BrassPlus::Withdraw " << endl;
}
~BrassPluse()
{
cout << "~BrassPlus()" << endl;
}
public:
int x;
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律