C++是支持多继承的,那么多继承关系中派生类对象模型和单继承关系中有什么不一样呢?我们来看一看。
首先给出一个多继承关系:
class Base1
{
public:
Base1()
: b1(1)
{
std::cout << "Base1()" << std::endl;
}
int b1;
};
class Base2
{
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有一个数据成员b1,在其构造函数中被初始化为1;类Base2有一个数据成员b2,在其构造函数中被初始化为2;类Derive继承自类Base1与类Base2(都是public继承),并且新增数据成员d,并初始化为3。我们在主函数中声明一个派生类对象,观察其内存数据:
与单继承关系一样,继承自基类的数据成员放在低地址空间,而派生类新增数据成员则放在高地址空间。那么继承自不同基类的数据成员的存放位置是随机存放还是按一定顺序存放的呢?在这里我们可以看到这里继承自两个基类的数据成员是按照继承关系声明的顺序存放的,是否所有多继承关系中都是这样的呢?
现在我们将继承关系声明中基类顺序交换一下:
class Derive :public Base2, public Base1
{
public:
Derive()
: d(3)
{
std::cout << "Derive()" << std::endl;
}
int d;
};
如果来自基类数据的存放顺序与继承关系声明顺序有关的话,现在派生类内存中的数据存放应该是:213。结果如何:
可以看到,随着继承关系声明中基类顺序的改变,派生类中继承自基类的数据成员存放顺序也发生了变化。
我们可以画出多继承关系中派生类的对象模型:
分析结束,望高手斧正。