深度探索C++ 对象模型(7)-Data member的布局(虚继承)
- 虚拟继承
namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print() {};private:float _x;float _y;}; class Point3d : public virtual Point2d { // virtual inheritancepublic:virtual void Point3dPrint() {};private:float _z;}; class Vertex : public virtual Point2d { // virtual inheritancepublic:// has virtual functionsvirtual void VertexPrint() {};private:Vertex* next;}; class Vertex3d : public Point3d, public Vertex {public:// ...private:float mumble;};void test(){ cout << "Point2d类、Point3d类、Vertex、Vertex3d类的大小:" << sizeof(Point2d) << " " << sizeof(Point3d) << " " << sizeof(Vertex) << " " << sizeof(Vertex3d) << endl;}
}
布局分为两种情况
- windows方案
ObjectConDerived::test();//输出结果:Point2d类、Point3d类、Vertex、Vertex3d类的大小:12 24 24 40
- virtual base class subobject部分在最后面,而base class根据继承的顺序依次排列
- 在每一个derived class object中安插了一个指针,这个指针用来指向virtual base class subobject(共享部分)//缺点:占空间
- 因此要对共享部分进行存取,可以通过相关指针间接
- unix方案
ObjectConDerived::test();//输出结果???
- 在virtual function table 中放置virtual base class的offset(不是地址)
- 共享局部的位置会因为每次的派生而发送变化
- 虚拟继承串链的加长,导致间接存取层次的增加。例如:如果我们有三层虚拟衍化,我就需要三次间接存取(经由三个virtual base class指针)。解决方案有:拷贝所有的virtual base class 的指针到drived class中。这样就解决了存取时间的问题,虽然会有空间的开销。
【引用】
[1]: <<深度探索C++ 对象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 译
[2]: 代码地址 https://github.com/thefistlei/cplusStudy.git
深度探索C++ 对象模型(7)-Data member的布局(虚继承)相关推荐
- 深度探索C++ 对象模型(7)-Data member的布局(无继承、继承无多态、继承多态、多层继承)
无继承 继承无多态 继承多态 虚表 : 用来存放基类的每一个虚函数,再加上首位的一个slots(支持RTTI). 每个class object导入一个vptr,提供执行期的链接,使得每一个class ...
- 深度探索C++ 对象模型(7)-Data member的布局(多重继承)
多重继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...
- 深度探索C++ 对象模型(6)-Data member的存取
nonstatic data member 需要在class object起始地址加上该member的偏移. class A {public: int x; int y;}; A a; a.y = 0 ...
- 深度探索C++ 对象模型(6)-Data member的绑定
防御性程序设计 1).将class声明起头处放data member; 代码示例: class Point3d{ float x,y,z; public://etc } 2). class的声明处放i ...
- [读书笔记] - 《深度探索C++对象模型》第3章 Data语意学
Table of Contents 1.Data Memeber的绑定 2.Data Member的布局 3.Data Member的存取 4."继承"于Data Member 4 ...
- 《深度探索C++对象模型》--3 Data语意学
1.Data Member的绑定 (1)"memberrewriting rule",一个inline函数实体,在整个class声明未被完全看见之前,是不会被评估求值的.所以 ...
- 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学
<深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...
- 深度探索C++ 对象模型(4)-Default Copy Constructor(2)
没有Default Constructor, class Myclass{ public://... private:int a;char *str; }; 编译器执行的是"位逐次拷贝(Bi ...
- 深度探索C++ 对象模型(3)-默认构造函数Default Constructor
1. Default Constructor只对base class subobjects和member class objects初始化,对data member不做操作 2. 编译器构造Defau ...
最新文章
- gltf与glb格式转换 gltf-pipeline、binary-gltf-utils
- int[]到string[]的转换方法 Array.ConvertAll
- 芯片设计抽象层及其设计风格
- python pandas读取excel-Python用Pandas读写Excel
- [vue] 你是从vue哪个版本开始用的?你知道1.x和2.x有什么区别吗?
- sr650服务器cpu型号,至强Gold 联想ThinkSystem SR650评测
- 一个程序员转产品经理的经验分享
- 20165235 第十周课下补做
- MongoDB索引概念及使用详解
- n != n, n == -n
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证....
- python 链表操作 优化_Python:如何修改列表时内存的使用和优化?
- bokeh 设置做图工具
- Android移动开发基础
- 高中信息技术python及答案_高中信息技术《Python语言》模块试卷.doc
- 基于ARM的网络收音机
- ROM, SRAM, SDRAM的区别
- id门禁卡复制到手机_门禁卡怎么复制到苹果手机?
- UDP攻击实战及其简略防御方法
- 启动idea后,打开项目不久后闪退
热门文章
- centos7配置 console口_玩转KVM-一招打开vm的console口
- java第三方接口对接_调用多个第三方接口哪一种方案更好?
- 语言学生学籍管理系统流程图_基于C语言的学生管理系统(含文件)(一)
- python的窗口处理模块_Python tkinter模块弹出窗口及传值回到主窗口操作详解
- 电脑不能打字_意外收到一台ThinkPad T400笔记本电脑,简单升级后,办公没问题...
- 利用计算机进入,1、在第四代计算机期间内,计算机的应用逐步进入到()
- 新基建7大产业链约500家企业图谱!
- mysql int zerofill_Mysql 中int[M]—zerofill-阿里云开发者社区
- pdf常用字体包 -baijiahao_PDF 的各种操作,我用 Python 来实现(附网站和操作指导)
- 独立按键控制数码管c语言,各位大佬,独立按键控制数码管为什么按下的时候要加一呢?...