uml 继承_多继承下的内存模型

前面几篇文章,我们介绍了简单对象的内存模型和单继承关系的内存模型。接下来,我们就介绍稍微复杂一点继承关系下的内存模型。这节我们先来看看多重继承,即,一个子类有多个父类。

多重继承的例子

class BaseA
{
public:
  virtual void testA();
private:
  int m_BA;
};

class BaseB
{
public:
  virtual void testB();
private:
  int m_BB;
};

class Deliver : public BaseA, public BaseB
{
public:
  virtual void testA();
  virtual void testB();
  virtual void testD();
private:
  int m_D;
};

UML类图:

4e8836ecad7b24585d004fde7ac839e3.png

子类内存模型构造过程

1,同样,先按照父类的方式构造内存空间,两个父类,按照继承的顺序,从左至右:

1)按照BaseA的方式构造内存空间

9779163f1b67b4aa95f45a288f47e43c.png

2)按照BaseB的方式构造内存空间

446fdeff983593a531c2018c6e8357f1.png

3)基于之前的内存空间再构建属于Deliver独有的成员:

新增Deliver的成员变量:7c3e328eb85d0e36a5d5a643137efff0.png

在第一张虚表中,使用Deliver::testA虚函数的指针覆盖BaseA::testA虚函数的指针:

a887b9ed4e4cbcb4ca18325a46d4ac0f.png

在第二张表中,使用Deliver::testB虚函数的指针覆盖BaseB::testB虚函数的指针:

f23a71576963d9fc957f7041f90a37a5.png

在第一张表中新增Deliver::testD()虚函数

dd53953bfa2723b4bb67eaf62a908cff.png

使用vs查看内存模型:8920eda3076769c3da5040464b2997b2.png

菱形继承

再看另外一种情况:

代码:

class Base{public:  int m_B;};class BaseA :  public Base{public:  virtual void testA();private:  int m_BA;};class BaseB : public Base{public:  virtual void testB();private:  int m_BB;};class Deliver : public BaseA, public BaseB{public:  virtual void testA();  virtual void testB();  virtual void testD();private:  int m_D;};

UML类图:

240e2f19be64d3929f5fcf6e81fe074f.png

两个父类共同继承于一个祖父类,整个形状,像菱形一样,俗称菱形继承。

菱形继承带来的问题

d631d4cf529d2ec38c05a13adea6ca06.png

使用VS查看内存模型:

f6fcfadca07c9c5a39c2dd8ac341b44e.png

问题就是:

1)Deliver的内存空间中有两份m_B,浪费内存空间

2)使用的时候会有歧义

原因是:

由于BaseA、BaseB各自继承于Base,所以,BaseA、BaseB分别有一份m_B,而 Deliver又是继承于BaseA、BaseB,自然Deliver的内存布局是分别按照BaseA、BaseB的方式来分配内存,所以,Deliver有两份m_B。

解决办法:

1)解决使用时候的歧义,可以通过指定访问对象来解决

Deliver dd;dd.BaseA::m_B =1;dd.BaseB::m_B =2;

2)要解决浪费空间的问题,就只能用虚继承来解决

推荐阅读:

C++全套资料(精心收集)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值