千家信息网

C++中菱形继承的示例分析

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章主要为大家展示了"C++中菱形继承的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C++中菱形继承的示例分析"这篇文章吧。菱形继承clas
千家信息网最后更新 2025年11月08日C++中菱形继承的示例分析

这篇文章主要为大家展示了"C++中菱形继承的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"C++中菱形继承的示例分析"这篇文章吧。

菱形继承

class Person {   int _AA; }; class Student:public Person {   int _BB; }; class Teacher :public Person {   int _CC; }; class Assistant :public Student, public Teacher {   int _DD; };


PS:

Assistant的对象中存在两份Person成员

菱形继承存在二义性和数据冗余

解决:

使用虚继承

首先不使用虚继承时:

#include using namespace std;  class AA { public:   string _aa; }; class BB :public AA { public:   int _bb; }; class CC :public AA { public:   int _cc; }; class DD :public BB, public CC { public:   int _dd; };  int main() {   DD d;   d.BB::_aa = 1;   d.CC::_aa = 2;   d._bb = 3;   d._cc = 4;   d._dd = 5;   cout << sizeof(d) << endl;   return 0; }


菱形继承对象模型:

使用虚继承时:

#include using namespace std;  class AA { public:   string _aa; }; class BB :virtual public AA { public:   int _bb; }; class CC :virtual public AA { public:   int _cc; }; class DD :public BB, public CC { public:   int _dd; };  int main() {   DD d;   d.BB::_aa = 1;   d.CC::_aa = 2;   d._bb = 3;   d._cc = 4;   d._dd = 5;   cout << sizeof(d) << endl;   return 0; }

菱形虚拟继承对象模型:

两个空格处地址相差为8,第一个空格处存放空格处位置到AA的偏移量为20,第二个空格处存放空格处位置到AA的偏移量为12,浪费两个空间存放偏移量,AA只需计算一次。

以上是"C++中菱形继承的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0