类多继承问题
Posted hanhuihanhui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类多继承问题相关的知识,希望对你有一定的参考价值。
下面的图片都是用的vs编译器生成的
对于这种多继承的类TestClassD
D的构造是先调用C的构造再调用B的构造
C和B的构造函数又调用了A的构造函数
然后再构造D的成员
-
A中有虚函数fun
A构造时 创建了虚函数表vftable 并且 在类中创建了vfptr的成员指向vftable
-
派生类B构造完 直接基类A后
构造派生类B的成员变量
构造的最后重写vftable
-
派生类C构造和派生类C一样
-
派生类D构造自己的成员变量 然后重写B和C中的vftable
派生类D的内存分布:
这种继承会产生的问题是 有重复的A的成员变量和虚函数指针和虚函数表
所以用到了虚继承 也就是在基类列表前面加上 virtual
对于这种情况的TestClassD
先构造虚基类A 再构造 B、C
要知道D的内存分布 可以画出原来的没有虚继承的内存分布
然后将虚基类A放到最后面 原来虚基类A的地方替换成vbptr
MSVC有个隐藏的"/d1"开关,通过这个开关可以查看项目中类的内存布局情况。
修改项目属性,添加"/d1 reportSingleClassLayoutCC"开关,表示需要查看类CC的内存布局。
编译,查看项目输出日志。
以上是关于类多继承问题的主要内容,如果未能解决你的问题,请参考以下文章