c++多继承布局

本文探讨了C++中的多继承和虚拟继承布局。在多继承中,对象地址可直接指定给最左端基类指针,而其他基类需要地址修正。虚拟继承则涉及共享部分的布局,通常通过插入指向虚拟基类的指针来实现存取,但这可能导致对象负担加重和存取速度减慢。解决方法包括使用virtual base class table和调整指针布局以减少间接访问层次。文章还提到了VS2013的虚拟继承布局实现。
摘要由CSDN通过智能技术生成

1:多重继承

对于一个继承了多个base class 的对象,将其地址指定给最左端(也就是第一个)base class的指针,
情况将和单一继承时相同,因为两者都指向相同的其实地址。至于第二个或者更后面的base class的
地址指定操作(把derived class对象地址 赋给 第二个base class类型的指针),则需要将地址修改
加上,介于中间的base class subobject(s)大小
如果有这样的继承关系

这里写图片描述
则布局情况

2:虚拟继承

虚拟继承

一般的布局策略是先安排好derived class 的不变部分,然后再建立其共享部分
如何存取class 的共享部分呢?
可以选择在derived class object中安插一些指针,每个指针指向一个vrtual base class,通过
间接存取的方式完成存取。
void Point3D:: operator+= (const Point3d &rhs)
{
_x += rhs._x;
_y += rhs._y;
_z += rhs._z;
}
可以被转换成这样:
__vbcPoint2d->_x += rhs.__vbcPoint2d->_x;
__vbcPoint2d->_y += rhs.__vbcPoint2d->_y;
_z += rhs._z;

Point2d *p2d = pv3d;
Point2d *p2d = pv3d ? pv3d->__vbcPoint2d : 0;
这样做的缺点很明显:
1. 每个对象必须针对每个virtual base class 添加一个额外的指针,这样virtual base class
越多,object负担越重。也就是负担不固定。
解决办法1:
引入一二virtual base class table。每个virtual base class都会由编译器安插一个指针
指向virtual base class table。真正的virtual base class 指针,被放在table中。也就是table中存放
了所有的virtual base class 的指针。每次要访问直接从virtual base class table中找到相应基类
解决办法2:
和virtual function table 放在一起,但是virtual base class存放在索引为负的地方,并且只存放偏移
根据object的基址以及取得的偏移就可以找到object中的virtual base class了。
2. 由于虚拟继承串链的加长,会导致间接存取的层次增加,也就是你想取得从一个 虚拟继承来的基类
的 他的虚拟继承的基类 的成员,就需要两次间接访问,层次越多,访问越慢。
解决办法:
把所有的virtual base class 的指针都放置在derived class object中,也就是原本需要两次间接操作的
现在我们把那个第二次间接操作需要的指针直接放在derived class object中去
这是vs2013的虚拟继承的布局。
这里写图片描述
然后还有超级复杂的终极版本:
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值