首页 > 其他 > 详细

类多继承问题

时间:2018-03-27 22:48:18      阅读:216      评论:0      收藏:0      [点我收藏+]

下面的图片都是用的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的内存布局。

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

类多继承问题

原文:https://www.cnblogs.com/hanhuihanhui/p/8660706.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!