码迷,mamicode.com
首页 > 其他好文 > 详细

类多继承问题

时间:2018-03-27 23:01:36      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:virt   情况   port   pos   post   color   产生   bubuko   隐藏   

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

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

类多继承问题

标签:virt   情况   port   pos   post   color   产生   bubuko   隐藏   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!