【面经笔记】虚函数表指针个数
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基类的虚函数表中,不会增加虚函数表指针个数。
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基类的虚函数表中,不会增加虚函数表指针个数。
相关文章推荐
- C++学习 - 虚表,虚函数,虚函数表指针学习笔记
- 【C++】学习笔记十一——指针、数组和指针算术
- 嵌入式软件开发培训笔记——C高级 指针和数组
- 【C Prime Plus】学习笔记,Chapter 12, 指针常量和常量指针
- C语言学习笔记21——多维数组和多维指针
- C++思考笔记-----Ruminations on C++ 之 被封装的指针----句柄
- 超强的指针学习笔记
- C++学习笔记 c++引用(&)与指针(*)的区别
- 面经笔记+来自腾讯后台开发内推2019
- OpenCV学习笔记09--通过cvPtr2D或指针算法绘制图形
- 【面经笔记】红黑树的特性与其在C++ STL中的应用
- c语言学习笔记31之函数指针
- 关于指针和数组的笔记
- 北京邮电大学2017菜鸟指针学习笔记
- c++指针学习笔记--交换两个字符串数据
- [C++ primer 学习笔记][04]数组和指针
- C++ Primer 学习笔记与思考_7 void和void*指针的用法
- C/C++中关于地址、指针和引用变量的学习笔记(七) : sizeof和typedef
- C++学习笔记---关于指针
- 笔记6:链表(三种:头指针、头结点、头结点循环)