菱形继承与虚拟继承

c++中的继承有单继承和多继承;本文主要探索的是多继承中菱形继承的二义性和数据冗余及解决方案;

菱形继承的对象模型:

                                    


从内存看菱形继承对象模型:


用一个简易 的代码来说明二义性和数据冗余这个问题:

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;
};

void test()
{
	DD s;

	s.BB::_aa = 0;
	s.CC::_aa = 1;
	s._bb = 2;
	s._cc = 3;
	s._dd = 4;

	
}


创建DD对象:

DD s;

s._aa = 1;访问_aa时会出现对_aa访问不明确的错误,可能是BB中的_aa,也可能是CC中的_aa;这就是二义性的问题;

可以指定所属类域来解决二义性问题,s.BB::_aa = 1; s.CC::_aa = 0; 但是这个并没有解决数据冗余的问题;

这就需要用到虚继承来解决二义性和数据冗余的问题;

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;
};
void test()
{
	DD s;

	s.BB::_aa = 0;
	s.CC::_aa = 1;
	s._bb = 2;
	s._cc = 3;
	s._dd = 4;

	
}


从内存看菱形虚拟继承对象模型:



由上图可以看出BB和CC中的_aa是同一个对象,解决了二义性和数据冗余的问题;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值