类多继承问题

Posted hanhuihanhui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类多继承问题相关的知识,希望对你有一定的参考价值。

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

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

以上是关于类多继承问题的主要内容,如果未能解决你的问题,请参考以下文章

多继承

一个关于C++多继承的问题

4CPP 面向对象之 ——多态多继承static 成员const 成员

Java第四天

C++学习:3多态

Python学习记录8-继承2