c++多继承布局
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++多继承布局的更多相关文章
- php随机10-thinkphp 3.1.3 模板继承 布局
8.25 模板继承 模 板继承是3.1.2版本添加的一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层.模板继承其实并不难理解,就好比类 的继承一样,模板也可以定义一个 ...
- php随笔10-thinkphp 3.1.3 模板继承 布局
8.25 模板继承 模 板继承是3.1.2版本添加的一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层.模板继承其实并不难理解,就好比类 的继承一样,模板也可以定义一个 ...
- Rails :布局和视图渲染
原文地址: http://guides.ruby-china.org/layouts_and_rendering.html Rails 布局和视图渲染 本文介绍 Action Controller 和 ...
- 【翻译】在Ext JS和Sencha Touch中创建自己定义布局
原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置 ...
- 【翻译】在Ext JS和Sencha Touch中创建自定义布局
原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置 ...
- android_自定义布局例子
为什么要写自定义布局: 1.在实现大量重复的子按键或者子布局时,如果一个一个去复写工作量庞大,就需要创建自定义布局直接导入布局里,可以节省大量的时间 创建自定义布局的步骤: 1.编写一个自定义xml布 ...
- CSS 层叠与继承
三种继承css方式 1.段内继承 <p style="color: red;font-size:50px;">样式原文</p> 原文变成 红色, 原文字体变 ...
- Android自定义日历控件(继承系统控件实现)
Android自定义日历控件(继承系统控件实现) 主要步骤 编写布局 继承LinearLayout设置子控件 设置数据 继承TextView实现有圆圈背景的TextView 添加Attribute 添 ...
- android自定义控件一站式入门
自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...
随机推荐
- Postgresql_根据执行计划优化SQL
执行计划路径选择 postgresql查询规划过程中,查询请求的不同执行方案是通过建立不同的路径来表达的,在生成许多符合条件的路径之后,要从中选择出代价最小的路径,把它转化为一个计划,传递给执行器执行 ...
- Python3.5中安装Scrapy包时出现问题
在Python3.5中安装Scrapy第三方库 pip install Scrapy 安装到后面出现的这类错误: error: Microsoft Visual C++ 14.0 is require ...
- java 三种循环及注意事项
package debug; public class Demo8 { public static void main(String[] args) { //采用for循环打印10次Java好 for ...
- POI生成Web版Word文件
POI生成Web版Word文件 1 通过URL的输入流实现 2 直接把Html文本写入到Word文件 所谓的使用POI生成Web版Word文件是指利用POI将Html代码插入到 ...
- dirty_background_ration 与 /proc/sys/vm/dirty_ratio
wappiness的值的大小对如何使用swap分区是有着很大的联系的.swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用s ...
- 关于栈和队列的一点点小知识-----C++自带函数
栈和队列我们可以用C++里自带的函数使用,就不必手写了 1.栈,需要开头文件 #include<stack> 定义一个栈s:stack<int> s; 具体操作: s.emp ...
- A类——Dima and a Bad XOR
http://codeforces.com/contest/1151/problem/B 题意: 给一个矩阵,只要找到每一列的任意一个异或和大于0,就找到解并返回,输出TAK和位置,没找到就输出NIE ...
- linux mint软件安装
安装linux mint步骤请自行百度,这里略过....下载地址:https://www.linuxmint.com/edition.php?id=246文档下载:https://www.linuxm ...
- Luogu P2661 信息传递
传送门 一眼就能看出来是个并查集 但是并不会写... 看了一下题解说是并查集求最小环qwq 所以,每次加入第i个小同学,判断如果他要告诉的小同学k最后会告诉他(也就是转回来了), 就说明出现了一个环, ...
- C++11 并发指南四(<future> 详解一 std::promise 介绍)
前面两讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread 和 std::m ...