1.什么是菱形继承
单继承:一个子类只有一个直接父类时称这个继承关系为单继承
多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承
菱形继承的问题:菱形继承有数据冗余和二义性的问题,数据冗余是由于创建多个相同类型的数据,浪费空间,二义性是由于两个不同的类同时继承了一个相同的类
虚拟继承可以解决菱形继承的二义性和数据冗余的问题.需要注意的是,虚拟继承不要在其他地
方去使用,且在B,C处使用virtual关键字即可。
2.菱形虚拟继承原理
为了研究虚拟继承原理,我们给出了一个简化的菱形继承继承体系,再借助内存窗口观察对象成
员的模型。
class A
{
public:
int _a;
};
// class B : public A
class B : virtual public A
{
public:
int _b;
};
// class C : public A
class C : virtual public A
{
public:
int _c;
};
class D : public B, public C
{
public:
int _d;
};
int main()
{
D d;
/*d._a = 1;
B b;
b._a = 0;
B* ptr = &b;
ptr->_a++;
ptr = &d;
ptr->_a++;*/
//cout << b._a << endl;
/*d.B::_a = 10;
d.C::_a = 11;
cout << d.B::_a << endl;
cout << d.C::_a << endl;*/
B b;
b._a = 10;
C c;
c._a = 11;
cout << b._a << endl;
cout << c._a << endl;
return 0;
}
在菱形继承情况下:有菱形继承的二义性和数据冗余的问题。
从上图中可以看出B中有一个·a,C中也有一个a,造成数据的二义性。
使用菱形继承:
这个数据为16进制的数据,为20和12,而20和12正好是B里面的指针减去A的指针和C里面的指针减去A的指针的大小,所以这两个数就是偏移量,这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A。所以使用虚拟继承可以解决数据冗余和二义性问题。
3.总结