您的位置:首页 > 其它

菱形继承与菱形虚拟继承的相关问题

2017-02-16 01:54 351 查看
1.首先什么是菱形继承呢?

首先菱形继承是由多重继承衍生出来的,一个子类具有两个或以上直接 父类的继承关系





#include<iostream>
using namespace std;
class AA
{
public:
int _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 = 0;
d.CC::_aa = 1;
d._bb = 2;
d._cc = 3;
d._dd = 4;

return 0;
}


在DD的对象模型中存在两份AA成员,所以菱形继承会存在二义性与数据冗余的问题,而为了解决这个问题,推出了虚拟继承的方法

#include<iostream>
using namespace std;
class AA
{
public:
int _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 = 0;
d.CC::_aa = 1;
d._bb = 2;
d._cc = 3;
d._dd = 4;

return 0;
}




在虚拟继承中完美诠释了以时间换空间

的做法,开辟出8个字节存放指针,在其地址上保存自己需要偏移量,从而调用成员,达到解决菱形继承二义性和数据冗余的目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: