派生类对象模型之多继承派生类对象模型

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。结果如何:
这里写图片描述
可以看到,随着继承关系声明中基类顺序的改变,派生类中继承自基类的数据成员存放顺序也发生了变化。
我们可以画出多继承关系中派生类的对象模型:
这里写图片描述

分析结束,望高手斧正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值