- 7
- 0
- 约3.97千字
- 约 16页
- 2016-11-07 发布于重庆
- 举报
15(多重继承虚继承的内存布局)
多重继承、虚继承的内存空间布局
对多重继承、虚继承的内存空间布局进行研究,循序渐进的进行处理,主要关注以下几点:
偏移表
虚表
数据成员
它们的位置
它们的大小及内容
它们间的关系。
1.1 单继承,无虚函数的情况
单继承、无虚函数的情况是:1)基类的数据成员
派生类新增的数据成员
派生类的大小是基类数据成员和派生类新增数据成员大小之和。
顺序是按照上面的基类、派生类的顺序进行布局。
1.2 单继承,有虚函数的情况
单继承、有虚函数的情况:
派生类的虚表指针
基类的数据成员
派生类新增的数据成员
其中,派生类的虚表,是在基类的虚表基础之上所作的修改,有可能是:
对基类中虚函数地址的覆盖
派生类中新增的虚函数地址
只要有虚函数,就有虚表产生。
虚表中条目的个数,是本类中虚函数的个数
虚表中各条目的顺序,与类中声明(定义)的虚函数顺序一致
1.3 多重继承,无虚函数的情况
多重继承、无虚函数的情况是:
基类的数据成员
基类的数据成员
派生类新增的数据成员
这里与1.1 单继承,无虚函数的情况 的差别是——可能存在多个基类。
这里基类数据成员的排放,是按照继承的数据依次进行的。
1.4 多重继承,有虚函数的情况
多重继承,有虚函数的情况是:
基类的虚表指针
基类的数据成员
基类的虚表指针
基类的数据成员
派生类新增的数据成员
这里与1.2 单继承,有虚函数的情况 的差别是——虚表
这里说基类的虚表指针,其实是不太恰当的,因为它们实际上是派生类虚表的一部分。
也就说,派生类的虚表是由多个基类的虚表所构成的。不存在一个单一的派生类的虚表。
派生类的虚表条目是在各基类的虚表基础之上修改所得,可能包括:
对基类中虚函数的覆盖, 会更新各基类虚表中的条目
派生类中新增的虚函数地址, 会追加到第一个继承的基类的虚表中
至此,上面
1.1 单继承,无虚函数的情况
1.2 单继承,有虚函数的情况
1.3 多重继承,无虚函数的情况
1.4 多重继承,有虚函数的情况
是从单继承/多重继承, 无/有虚函数的角度 进行的梳理。
下面将以菱形继承为主线,来进行梳理。
(菱形继承中可能出现二义性,会逐步的引入虚继承,虚基类的概念)
菱形继承(diamond-inheritance)
1.5 菱形继承,无虚函数的情况
Class A {};
Class B: public A {};
Class C: public A {};
Class D: public B, public C {};
菱形继承,无虚函数的情况是:
基类B的数据成员
基类A的数据成员
派生类B新增的数据成员
基类C的数据成员
基类A的数据成员
派生类C新增的数据成员
派生类D新增的数据成员
这里仍然是没有太大的变化,按照基类、派生类的顺序安放数据成员。
1.6 菱形继承,有虚函数的情况
Class A {};
Class B: public A {};
Class C: public A {};
Class D: public B, public C {};
菱形继承,有虚函数的情况:
基类B的虚表指针
基类A的虚函数 (未被覆盖的部分)
基类B的虚函数 (覆盖A的部分,新增的部分)
派生类D的虚函数 (新增的部分)
基类B的数据成员
基类A的数据成员
派生类B新增的数据成员
基类C的虚表指针
基类A的函数 (未被覆盖的部分)
基类C的虚函数 (覆盖A的部分,新增的部分
基类C的数据成员
基类A的数据成员
派生类C新增的数据成员
派生类D新增的数据成员
仍然要说一点,这里说基类的虚表指针,其实是不太合适的,它们是派生类的虚表的一部分,是派生类在基类的虚表基础之上所做修改而来的:
如果派生类中的虚函数与基类中的形成覆盖,则派生类会对基类的虚表中相应条目做覆盖处理
派生类中新增的虚函数地址,追加至第一个继承的基类虚表中。
1.7 菱形继承,无虚函数,为虚继承的情况
在上面的
1.5 菱形继承,无虚函数的情况
1.6 菱形继承,有虚函数的情况
中,最基类A,在内存空间中有多份拷贝。
利用虚继承可以解决,此时最基类A成为虚基类。
所以,菱形继承,无虚函数,为虚继承的情况,也就是菱形继承,无虚函数,有虚基类的情况。
虚继承的引入,使得虚基类在内存中仅存一份拷贝,同时带来的影响还有内存空间布局的变化。
大概有:
虚基类的数据成员在内存中的位置
偏移表
偏移表的存在,是因为——虚基类的单份存在,而虚基类A又被B, C所共享,所以对B,C而言,它们就各自需要确定A的所在位置。 偏移表就是用于该问题。
偏移表的数目,就是直接继承自虚基类的派生类的数目。
现在来一一测试。
在看到这些
您可能关注的文档
最近下载
- 新能源汽车驱动电机电机驱动器热设计研究报告.docx
- 2025-2030中国矫形鞋垫行业市场深度调研及发展前景与投资预测研究报告.docx
- 《GB_T 26882.1-2024粮油储藏 粮情测控系统 第1部分:通则》专题研究报告.pptx
- 2021年宁夏高职分类考试英语试卷.docx VIP
- 2025年河北农信社真题及答案.docx VIP
- 课外阅读专能力训练-说明文(含答案) 语文四年级上册(统编版).docx VIP
- 总务科意见建议书.docx VIP
- 汽车智能座舱系统与应用课件:认知智能座舱系统的概念及结构.pptx VIP
- 汽车智能座舱系统与应用课件:对智能座舱硬件的基本认知.pptx VIP
- EVB_JW5065_杰华特 中文资料 规格书 pdf 下载电源管理芯片全线代理.pdf VIP
原创力文档

文档评论(0)