您的位置:首页 > 其它

【面经笔记】虚函数表指针个数

2017-08-02 14:02 295 查看
本文参考了

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基类的虚函数表中,不会增加虚函数表指针个数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: