当继承关系超过两重后,就不可避免地出现菱形继承的问题,什么是菱形继承呢?我们来看一个图:
像这样,类B1、B2继承自类A,而类C又与类B1、B2是多继承的关系,整个继承关系呈菱形,这就是菱形继承。那么菱形继承存在什么问题呢?先给出这样一个继承关系:
class A
{
public:
A()
: a(0)
{
std::cout << "A()" << std::endl;
}
int a;
};
class Base1 : public A
{
public:
Base1()
: b1(1)
{
std::cout << "Base1()" << std::endl;
}
int b1;
};
class Base2 : public A
{
public:
Base2()
: b2(2)
{
std::cout << "Base2()" << std::endl;
}
int b2;
};
class Derive :public Base1, public Base2
{
public:
Derive()
: d(3)
{
std::cout << "Derive()" << std::endl;
}
int d;
};
这里类Base1、Base2继承自类A,而类Derive又继承自类Base1与Base2,Base1与Base2和类A的继承关系属于单继承,通过前面的分析,我们已经知道单继承关系中派生类的对象模型,现在来探究一下菱形继承中最下层的派生类的对象模型。
首先来看一下类Base1与Base2的内存数据存放:
我们知道,类Derive与类Base1和Base2属于多继承关系,因此类Derive对象的内存数据存放是这样的:
因此可以画出菱形继承中最下层的派生类对象模型:
分析完毕,望高手斧正。