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的虚拟继承的布局。



然后还有超级复杂的终极版本:

最新文章

  1. DataTable转换为JSON数组
  2. NDO to PNP( ndoutils to PNP4Nagios)
  3. MVC中调用Public_Class时,VS2012老提示:当前上下文中不存在名称“Json”的解决方法
  4. html5的小知识点小集合
  5. 安卓开发笔记——深入Activity
  6. #Leet Code# Permutation
  7. 深入理解C#第二版笔记
  8. MYSQL开发技巧之行转列和列转行
  9. Microsoft Build 2016
  10. TcpListener 示例
  11. Android与Linux以及GNU的关系
  12. An annotation based command line parser
  13. 忘记秘密利用python模拟登录暴力破解秘密
  14. ReactiveCocoa基础
  15. 树莓派上使用KickThemOut对局域网内的设备进行ARP欺骗
  16. 3D中的OBJ文件格式详解
  17. Docker微容器+微服务将颠覆传统的软件架构
  18. 干货分享!DevExpress v17.1最新版帮助文档下载大全
  19. 【转】Java代码操作Redis的sentinel和Redis的集群Cluster操作
  20. javah生成jni头文件时报错 Error: cannot access android.support...

热门文章

  1. 模拟开户接口,使用shell脚本实现批量用户开通
  2. Iptables防火墙(SNAT和DNAT)
  3. ES 使用小结
  4. GUI_菜单练习
  5. NOIP2018 AFO记
  6. pymysql使用(二)
  7. PHP 用 fsockopen()、fputs() 来请求一个 URL,不要求返回
  8. LINUX配置过程记录
  9. powerDesigner创建类及数据模型
  10. pstart