作者:爱碩爱你_静莫失心 | 来源:互联网 | 2023-06-04 17:56
本文参考了http:www.cnblogs.comjerry19880126p3616999.html上述博客给出了以下结论:每个类都有虚指针和虚表;如果不是虚继承,那么
本文参考了
http://www.cnblogs.com/jerry19880126/p/3616999.html
上述博客给出了以下结论:
- 每个类都有虚指针和虚表;
- 如果不是虚继承,那么子类将父类的虚指针继承下来,并指向自身的虚表(发生在对象构造时)。有多少个虚函数,虚表里面的项就会有多少。多重继承时,可能存在多个的基类虚表与虚指针;
- 如果是虚继承,那么子类会有两份虚指针,一份指向自己的虚表,另一份指向虚基表,多重继承时虚基表与虚基表指针有且只有一份。
我觉的上述博客中结论有些不妥,自己做了实验进行验证,记录如下:
添加新虚函数
首先看一下普通继承下,子类中定义新的虚函数会发生什么:
子类B中没有定义新虚函数:
子类B中定义新虚函数:
红色框区域可知,新定义的虚函数和基类的虚函数保存于一个虚函数表,虚函数指针个数没有改变。
再看一下虚继承:
对比第一幅图和这幅图,可知虚继承中会多一个vbptr指针,它不是虚函数表指针。
为什么这里会出现vbptr,因为虚基类派生出来的类中,虚基类的对象不在固定位置(应该是在尾部),需要一个中介才能访问虚基类的对象.所以子类需要有一个vbptr,对应的table中需要有一项指向虚基类.
http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html
虚继承下,子类中定义新的虚函数:
对比第二幅图和这幅图,可知虚继承下添加新的虚函数,会新添加新的虚函数表和虚函数指针,即基类的虚函数表中的函数是不增加的。
至此,可知:虚基类的虚函数表是不能加入新虚函数的,而普通基类的虚函数表是可以增加新的虚函数。
在子类中没有增加新的虚函数时,虚函数表指针不变;
当子类中增加新的函数时,虚继承的子类会增加一个虚函数表用于保存新的虚函数,故会多一个虚函数表指针。
非虚多重继承:
非虚多重继承会将所有基类的虚函数表继承下来。新增加的虚函数会增加到继承顺序第一的基类的虚函数表中。
多重虚继承:
由于定义了新的虚函数而两个基类都是虚继承,所以需要新建虚函数表:故共有两个基类虚函数表指针,一个新的虚函数表指针。
钻石继承:
从前面实验可知:B、C均有两个虚函数表指针
对于D:由于虚基类的虚函数表只会存在一份,所以D会有一个A类的虚函数表指针,并有B、C基类的虚函数表指针。共3个指针。
D中新加的虚函数会添加到B基类的虚函数表中,不会增加虚函数表指针个数。