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. [软件逆向]实战Mac系统下的软件分析+Mac QQ和微信的防撤回

      0x00  一点废话 最近因为Mac软件收费的比较多,所以买了几款正版软件,但是有的软件卖的有点贵,买了感觉不值,不买吧,又觉得不方便,用别人的吧,又怕不安全.于是我就买了正版的Hopper Di ...

  2. 【Linux】磁盘的分区与命名规则

    1,Startx:切换到图形界面 2,Pwd:查看当前目录 3,Whoami:查看当前用户 4,Cd:   1. 命令格式: cd [目录名]       2. 命令功能: 切换当前目录至dirNam ...

  3. Lua 基础之Weak Table(5)

    Lua垃圾收集策略 Lua自动进行内存的管理.程序只能创建对象,而没有执行删除对象的函数.通过使用垃圾收集技术,Lua会自动删除那些失效的对象,也就是引用为0 的对象.但是呢?有些对象,引用没有指向它 ...

  4. SQLite基本操作-----IOS(如有雷同,纯属巧合)

    一.常用方法 sqlite3          *db, 数据库句柄,跟文件句柄FILE很类似 sqlite3_stmt      *stmt, 这个相当于ODBC的Command对象,用于保存编译好 ...

  5. golang变量的注意

    方法内部的变量使用方法: /* 定义三个变量,它们分别初始化为相应的值 vname1为v1,vname2为v2,vname3为v3 编译器会根据初始化的值自动推导出相应的类型 */ vname1, v ...

  6. Wampserver虚拟机配置记录

    原文地址:http://blog.csdn.net/clj9017/article/details/12705725 第一步 在http.conf 文件里面找到 ,开启 Virtual hosts # ...

  7. centos7下安装docker(11容器操作总结)

    这段时间主要是学习了对容器的操作,包括:容器的状态:start,stop,restart,rename,pause,unpause,rm,attach,exec,kill,logs:还学习了对容器的资 ...

  8. 实现图片旋转木马3D浏览效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. docker in docker 出现 libltdl.so.7 问题

    # docker ps -adocker: error while loading shared libraries: libltdl.so.7: cannot open shared object ...

  10. 按行读取.txt文件,并按行写入到新文件中

    package com.test.io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fi ...