时间:2021-05-20
菱形继承
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<iostream> 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<iostream> using namespace std; class AA { public: string _aa; }; class BB :<span style="color:#FF0000;">virtual</span> public AA { public: int _bb; }; class CC :<span style="color:#FF0000;">virtual</span> 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只需计算一次。
PS:
1.虚继承解决了在菱形继承体系里面子类对象包含多份父类对象的数据冗余&浪费空间的问题。
2.虚继承体系看起来好复杂,在实际应用我们通常不会定义如此复杂的继承体系。一般不到万不得已都不要定义菱形结构的虚继承体系结构,因为使用虚继承解决数据冗余问题也带来了性能上的损耗。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
命名空间是C++非常重要的概念,本文就以实例形式对其进行深入分析,具体内容如下:通常来说,在C++中,命名空间(namespace)的目的是为了防止名字冲突。每
前言菱形继承是多重继承中跑不掉的,Java拿掉了多重继承,辅之以接口。C++中虽然没有明确说明接口这种东西,但是只有纯虚函数的类可以看作Java中的接口。在多重
本文较为深入的探讨了C++继承中的访问控制,对深入掌握C++面向对象程序设计是非常必要的。具体内容如下:通常来说,我们认为一个类有两种不同的用户:普通用户和类的
C/C++公有继承、保护继承和私有继承的区别在c++的继承控制中,有三种不同的控制权限,分别是public、protected和private。定义派生类时,若
本文实例讲述了C++多重继承引发的重复调用问题与解决方法。分享给大家供大家参考,具体如下:前面简单介绍了一个C++多重继承功能示例,这里再来分析一个多重继承引发