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



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

c++多继承布局的更多相关文章

  1. php随机10-thinkphp 3.1.3 模板继承 布局

    8.25 模板继承 模 板继承是3.1.2版本添加的一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层.模板继承其实并不难理解,就好比类 的继承一样,模板也可以定义一个 ...

  2. php随笔10-thinkphp 3.1.3 模板继承 布局

    8.25 模板继承 模 板继承是3.1.2版本添加的一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层.模板继承其实并不难理解,就好比类 的继承一样,模板也可以定义一个 ...

  3. Rails :布局和视图渲染

    原文地址: http://guides.ruby-china.org/layouts_and_rendering.html Rails 布局和视图渲染 本文介绍 Action Controller 和 ...

  4. 【翻译】在Ext JS和Sencha Touch中创建自己定义布局

    原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置 ...

  5. 【翻译】在Ext JS和Sencha Touch中创建自定义布局

    原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置 ...

  6. android_自定义布局例子

    为什么要写自定义布局: 1.在实现大量重复的子按键或者子布局时,如果一个一个去复写工作量庞大,就需要创建自定义布局直接导入布局里,可以节省大量的时间 创建自定义布局的步骤: 1.编写一个自定义xml布 ...

  7. CSS 层叠与继承

    三种继承css方式 1.段内继承 <p style="color: red;font-size:50px;">样式原文</p> 原文变成 红色, 原文字体变 ...

  8. Android自定义日历控件(继承系统控件实现)

    Android自定义日历控件(继承系统控件实现) 主要步骤 编写布局 继承LinearLayout设置子控件 设置数据 继承TextView实现有圆圈背景的TextView 添加Attribute 添 ...

  9. android自定义控件一站式入门

    自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...

随机推荐

  1. JavaScript大杂烩7 - 理解内置集合

    JavaScript内置了很多对象,简单的类型如String,Number,Boolean (相应的"值类型"拥有相同的方法),复杂一点的如Function,Object,Arra ...

  2. 利用朴素贝叶斯分类算法对搜狐新闻进行分类(python)

    数据来源  https://www.sogou.com/labs/resource/cs.php介绍:来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提供URL ...

  3. redis-4.0.11主从配置初步探究

    redis-4.0.11相较于以前版本,新增了几个安全措施,稍稍研究了6379.conf配置文件,在这里记录一下. 实验环境: centos7.4 redis:redis-4.0.11 1. redi ...

  4. python第六十五天--python操作mysql

    pymysql模块对mysql进行 import pymysql # 创建连接 conn = pymysql.connect(host='127.0.0.1', port=3306, user='ro ...

  5. vi 复制或剪切多行超级强大方法

    同一个文件:光标移到起始行,输入ma 光标移到结束行,输入mb 光标移到粘贴行,输入mc 然后 :'a, 'b co 'c 把 co 改成 m 就成剪切了多个文件:在文件一: 光标移到起始行,输入ma ...

  6. 第五章 绘图基础(ALTWIND)

    线上箭头表示画线的方向.WINDING模式和ALTERNATE模式都会填充三个封闭的L型区域,号码从1到3.两个更小的内部区域,号码为4和5,在ALTERNATE模式下不被填充.但是在WINDING模 ...

  7. pycharm的安装和使用小技巧

    一,pycharm 1,在官网下载pycharm,版本选5.0,一定要下载专业版. 2,注册方法:注册时选择 license server,填入:http://idea.qinxi1992.cn,然后 ...

  8. Android Studio入门问题汇总

    1.如何设置 AS 中的字体大小 2.如何切换 AS 的皮肤颜色,默认为黑色,修改为白色,改为 default 3.首次安装 Android Studio并打开时,如果创建了一个新工程并将工程保存在另 ...

  9. 离线安装PostgreSQL

    postgresql在线安装很简单,但是很多情况,服务器不能联网,需要离线安装.下面是离线安装的步骤: 1. 首先进入官网: https://www.postgresql.org/ 2. 点击Down ...

  10. 协程与concurent.furtrue实现线程池与进程池

    1concurent.furtrue实现线程池与进程池 2协程 1concurent.furtrue实现线程池与进程池 实现进程池 #进程池 from concurrent.futures impor ...