这篇文章主要为大家展示了“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<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 >virtual</span> public AA { public: int _bb; }; class CC :<span >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只需计算一次。
以上是“C++中菱形继承的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。