菱形继承是继承里面比较复杂的有一种,在这里我分别对菱形继承、菱形虚拟继承、菱形虚拟继承含虚函数这几种情况
一、菱形继承
看下图就是一个菱形继承
#include<iostream>
using namespace std;
class A
{
public:
int _a;
};
class B : public A
{
public:
int _b;
};
class C : public A
{
public:
int _c;
};
class D : public C, public B
{
public:
int _d;
};
int main()
{
D dd;
cout << sizeof(dd) << endl;
dd.B::_a = 1;
dd._b = 3;
dd.C::_a = 2;
dd._c = 4;
dd._d = 5;
B bb;
C cc;
cout << sizeof(bb) << endl;
return 0;
}
从内存监视口可以发现dd占用20个字节,但是通过视窗口可以明显发现C类和B类继承的同一个A类的成员_a的值不一样,这就产生了二义性,同一个成员怎可么可以同时又两个值呢?
所以为了解决在菱形继承或者多继承中都会出现的二义性和数据冗余的问题,就提出来虚继承,下面来看看虚继承是怎么实现的..
二.菱形虚拟继承
在子类继承基类时,通过virtual关键字就可以虚继承,下面我们通过内存布局来看看虚继承是怎么处理数据二义性的...