虚函数是C++实现多态的重要一环,彻底弄懂它是非常有必要的。
其中有两点需要注意。
一、虚函数表
如果你之前对虚函数(表)的实现机制没有什么了解的话,可以访问这个博客。https://blog.twofei.com/496/
我简单的总结一下虚函数(表)的实现机制。
1、如果没有在需要重载和函数前面加virtual,那便不能实现多态。继承类的函数在编译时被静态绑定到基类的相关函数。
2、有虚函数的类会维持一份虚函数表。这个虚函数表是一个函数指针,存储着虚函数的地址。那么这意味着两点:(1)、无论有多少虚函数,类的大小只会增加4字节(sizeof(void*)==4)(2)、类的不同实例都是指向一个虚函数表地址。
3、继承类的新虚函数会依附在第一个继承的基类的虚函数表上,没有覆盖基类的虚函数表。
二、类的声明和定义
先来看一段代码
class Base1 { public: int base1_1; int base1_2; virtual void base1_fun1() { cout << "base1_fun1()" << endl; } virtual void base1_fun2() { cout << "base1_fun2()" << endl; } }; class Derive1 : public Base1 { public: int derive1_1; int derive1_2; // 覆盖基类函数 virtual void base1_fun1() { cout << "base1_fun1() is changed by derive1" << endl; } virtual void Derive1() { cout << "Derivel()" << endl; } }; int main() { Base1* b1 = new Base1; Derive1* d1 = new Derive1; Base1* b1d = (Base1*)new Derive1; //Derive1 db1 = (Derive1*)new Base1; 报错 b1->base1_fun1(); d1->base1_fun1(); b1d->base1_fun1(); //b1d->Derivel() 报错 }
是不是对 Base1* b1d = (Base1*)new Derive1; 感到很疑惑。我们来看一下运行结果:
由此,我们可以知道,当以继承类大小申请内存空间,但是内存空间却被基类指针指向时,这个指针其实是阉割版继承类。阉割了什么呢?把除了基类相关的一切都阉割了。但是要注意一点基类的虚函数还是被覆盖了。
原文链接: https://www.cnblogs.com/guanzhanyi/p/12937300.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/350094
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!