类多继承问题

下面的图片都是用的vs编译器生成的

对于这种多继承的类TestClassD

D的构造是先调用C的构造再调用B的构造

C和B的构造函数又调用了A的构造函数

然后再构造D的成员

 

  1. A中有虚函数fun

A构造时 创建了虚函数表vftable 并且 在类中创建了vfptr的成员指向vftable

 

  1. 派生类B构造完 直接基类A后

构造派生类B的成员变量

构造的最后重写vftable

 

  1. 派生类C构造和派生类C一样

 

  1. 派生类D构造自己的成员变量 然后重写B和C中的vftable

 

派生类D的内存分布:

 

这种继承会产生的问题是 有重复的A的成员变量和虚函数指针和虚函数表

所以用到了虚继承 也就是在基类列表前面加上 virtual

对于这种情况的TestClassD

先构造虚基类A 再构造 B、C

要知道D的内存分布 可以画出原来的没有虚继承的内存分布

然后将虚基类A放到最后面 原来虚基类A的地方替换成vbptr

MSVC有个隐藏的"/d1"开关,通过这个开关可以查看项目中类的内存布局情况。

修改项目属性,添加"/d1 reportSingleClassLayoutCC"开关,表示需要查看类CC的内存布局。

编译,查看项目输出日志。

posted @ 2018-03-27 22:33  hanhuihanhui  阅读(168)  评论(0编辑  收藏  举报