首页 > 学院 > 开发设计 > 正文

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

2019-11-08 19:44:53
字体:
来源:转载
供稿:网友

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个字节存放指针,在其地址上保存自己需要偏移量,从而调用成员,达到解决菱形继承二义性和数据冗余的目的。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表