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

来源:互联网 发布:tp5 command.php 编辑:程序博客网 时间:2024/04/26 17:32

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

0 0
原创粉丝点击