• 虚拟继承
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的布局(虚继承)相关推荐

  1. 深度探索C++ 对象模型(7)-Data member的布局(无继承、继承无多态、继承多态、多层继承)

    无继承 继承无多态 继承多态 虚表 : 用来存放基类的每一个虚函数,再加上首位的一个slots(支持RTTI). 每个class object导入一个vptr,提供执行期的链接,使得每一个class ...

  2. 深度探索C++ 对象模型(7)-Data member的布局(多重继承)

    多重继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...

  3. 深度探索C++ 对象模型(6)-Data member的存取

    nonstatic data member 需要在class object起始地址加上该member的偏移. class A {public: int x; int y;}; A a; a.y = 0 ...

  4. 深度探索C++ 对象模型(6)-Data member的绑定

    防御性程序设计 1).将class声明起头处放data member; 代码示例: class Point3d{ float x,y,z; public://etc } 2). class的声明处放i ...

  5. [读书笔记] - 《深度探索C++对象模型》第3章 Data语意学

    Table of Contents 1.Data Memeber的绑定 2.Data Member的布局 3.Data Member的存取 4."继承"于Data Member 4 ...

  6. 《深度探索C++对象模型》--3 Data语意学

     1.Data Member的绑定 (1)"memberrewriting rule",一个inline函数实体,在整个class声明未被完全看见之前,是不会被评估求值的.所以 ...

  7. 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学

     <深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...

  8. 深度探索C++ 对象模型(4)-Default Copy Constructor(2)

    没有Default Constructor, class Myclass{ public://... private:int a;char *str; }; 编译器执行的是"位逐次拷贝(Bi ...

  9. 深度探索C++ 对象模型(3)-默认构造函数Default Constructor

    1. Default Constructor只对base class subobjects和member class objects初始化,对data member不做操作 2. 编译器构造Defau ...

最新文章

  1. gltf与glb格式转换 gltf-pipeline、binary-gltf-utils
  2. int[]到string[]的转换方法 Array.ConvertAll
  3. 芯片设计抽象层及其设计风格
  4. python pandas读取excel-Python用Pandas读写Excel
  5. [vue] 你是从vue哪个版本开始用的?你知道1.x和2.x有什么区别吗?
  6. sr650服务器cpu型号,至强Gold 联想ThinkSystem SR650评测
  7. 一个程序员转产品经理的经验分享
  8. 20165235 第十周课下补做
  9. MongoDB索引概念及使用详解
  10. n != n, n == -n
  11. 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证....
  12. python 链表操作 优化_Python:如何修改列表时内存的使用和优化?
  13. bokeh 设置做图工具
  14. Android移动开发基础
  15. 高中信息技术python及答案_高中信息技术《Python语言》模块试卷.doc
  16. 基于ARM的网络收音机
  17. ROM, SRAM, SDRAM的区别
  18. id门禁卡复制到手机_门禁卡怎么复制到苹果手机?
  19. UDP攻击实战及其简略防御方法
  20. 启动idea后,打开项目不久后闪退

热门文章

  1. centos7配置 console口_玩转KVM-一招打开vm的console口
  2. java第三方接口对接_调用多个第三方接口哪一种方案更好?
  3. 语言学生学籍管理系统流程图_基于C语言的学生管理系统(含文件)(一)
  4. python的窗口处理模块_Python tkinter模块弹出窗口及传值回到主窗口操作详解
  5. 电脑不能打字_意外收到一台ThinkPad T400笔记本电脑,简单升级后,办公没问题...
  6. 利用计算机进入,1、在第四代计算机期间内,计算机的应用逐步进入到()
  7. 新基建7大产业链约500家企业图谱!
  8. mysql int zerofill_Mysql 中int[M]—zerofill-阿里云开发者社区
  9. pdf常用字体包 -baijiahao_PDF 的各种操作,我用 Python 来实现(附网站和操作指导)
  10. 独立按键控制数码管c语言,各位大佬,独立按键控制数码管为什么按下的时候要加一呢?...