这篇文章主要为大家展示了“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++中菱形继承的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。