ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:340.22KB ,
资源ID:16392846      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16392846.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(15多重继承虚继承的内存布局Word格式.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

15多重继承虚继承的内存布局Word格式.docx

1、3)派生类新增的数据成员其中,派生类的虚表,是在基类的虚表基础之上所作的修改,有可能是:1)对基类中虚函数地址的覆盖2)派生类中新增的虚函数地址1)只要有虚函数,就有虚表产生。2)虚表中条目的个数,是本类中虚函数的个数 3)虚表中各条目的顺序,与类中声明(定义)的虚函数顺序一致1.3 多重继承,无虚函数的情况多重继承、无虚函数的情况是:这里与1.1 单继承,无虚函数的情况 的差别是可能存在多个基类。这里基类数据成员的排放,是按照继承的数据依次进行的。1.4 多重继承,有虚函数的情况多重继承,有虚函数的情况是:1)基类的虚表指针3)基类的虚表指针4)基类的数据成员5)派生类新增的数据成员这里与1

2、.2 单继承,有虚函数的情况 的差别是虚表这里说基类的虚表指针,其实是不太恰当的,因为它们实际上是派生类虚表的一部分。也就说,派生类的虚表是由多个基类的虚表所构成的。不存在一个单一的派生类的虚表。派生类的虚表条目是在各基类的虚表基础之上修改所得,可能包括:1) 对基类中虚函数的覆盖, 会更新各基类虚表中的条目2) 派生类中新增的虚函数地址, 会追加到第一个继承的基类的虚表中至此,上面是从单继承/多重继承, 无/有虚函数的角度 进行的梳理。下面将以菱形继承为主线,来进行梳理。(菱形继承中可能出现二义性,会逐步的引入虚继承,虚基类的概念)菱形继承(diamond-inheritance)1.5 菱

3、形继承,无虚函数的情况Class A ;Class B: public A ;Class C:Class D: public B, public C ;菱形继承,无虚函数的情况是:1)基类B的数据成员a) 基类A的数据成员b) 派生类B新增的数据成员2)基类C的数据成员b) 派生类C新增的数据成员3)派生类D新增的数据成员这里仍然是没有太大的变化,按照基类、派生类的顺序安放数据成员。1.6 菱形继承,有虚函数的情况菱形继承,有虚函数的情况:1) 基类B的虚表指针a) 基类A的虚函数 (未被覆盖的部分)b) 基类B的虚函数 (覆盖A的部分,新增的部分)c) 派生类D的虚函数 (新增的部分)2)

4、基类B的数据成员3) 基类C的虚表指针a) 基类A的函数 (未被覆盖的部分)b) 基类C的虚函数 (覆盖A的部分,新增的部分4) 基类C的数据成员5) 派生类D新增的数据成员仍然要说一点,这里说基类的虚表指针,其实是不太合适的,它们是派生类的虚表的一部分,是派生类在基类的虚表基础之上所做修改而来的:1) 如果派生类中的虚函数与基类中的形成覆盖,则派生类会对基类的虚表中相应条目做覆盖处理2) 派生类中新增的虚函数地址,追加至第一个继承的基类虚表中。1.7 菱形继承,无虚函数,为虚继承的情况在上面的中,最基类A,在内存空间中有多份拷贝。利用虚继承可以解决,此时最基类A成为虚基类。所以,菱形继承,无

5、虚函数,为虚继承的情况,也就是菱形继承,无虚函数,有虚基类的情况。虚继承的引入,使得虚基类在内存中仅存一份拷贝,同时带来的影响还有内存空间布局的变化。大概有:1)虚基类的数据成员在内存中的位置2)偏移表偏移表的存在,是因为虚基类的单份存在,而虚基类A又被B, C所共享,所以对B,C而言,它们就各自需要确定A的所在位置。 偏移表就是用于该问题。偏移表的数目,就是直接继承自虚基类的派生类的数目。现在来一一测试。在看到这些信息后,我们猜测其内存空间的布局:1) B的偏移表, 在ecx处 2) B的数据成员, 在ecx + 4处3) C的偏移表, 在ecx + 8处4) C的数据成员,在ecx + 0

6、C处5) D的数据成员, 在ecx + 10处6) A的数据成员, 在ecx + 14处下面先对偏移表进行跟踪正是通过这些入栈操作,来进行条件跳转的。这是最后的内存空间布局。现总结如下:1) 基类B的偏移表指针 2) 基类B新增的数据成员3) 基类C的偏移表指针4) 基类C新增的数据成员6) 虚基类的数据成员1.8 菱形继承,有虚函数,为虚继承的情况相较于1.7,这里增加了虚函数,那么又有什么不同呢?根据这些,大概猜测其内存空间布局如下:1)基类B的虚表指针2)基类B的偏移表指针3)基类B的数据成员4)基类C的虚表指针5)基类C的偏移表指针6)基类C的数据成员7)派生类D的虚表指针 (后证实,

7、不是这样的,而是分割)8)派生类D的数据成员9)虚基类A的虚表10)虚基类A的数据成员下面来一一查看。设置偏移表。偏移表的设置,在虚表设置之前。这里的偏移表的第二项,用于确定本类(B)对虚基类(A)的定位。而第一项,像是本类的虚表指针相对于偏移表的偏移。这里有分割线的概念,用于分割非虚基类和虚基类。此时,对于两个虚表,有点疑惑至此,完成了对内存空间布局的更新,现总结如下:a) B新增的虚函数b) D新增的虚函数2) 基类B的偏移表指针3) 基类B新增的数据成员4) 基类C的虚表指针a) C新增的虚函数5) 基类C的偏移表指针6) 基类C新增的数据成员7) 派生类D新增的数据成员8) 分割9)

8、虚基类的虚表指针a) A未被覆盖的虚函数b) D覆盖的虚函数10) 虚基类的数据成员所以,这里各虚表的特点是仅存放新增的虚函数地址。至于那些覆盖的,则放在虚基类的虚表中。上面这些,是以菱形继承为基础,控制有无虚函数,是否为虚继承,所进行的测试。2. 总结现在来试着从更全面的角度来看,试图总结它们的规律。2.1 无虚函数,仅有数据成员的情况1.1, 1.3, 1.5的布局都很相似基类数据成员、派生类新增的数据成员按照这样的顺序进行排放。而在1.7的情境中,因虚基类的存在,仅存一份拷贝,引入偏移表。2.2 有虚函数的情况这是虚函数的存在,引入了虚表。可见它们也大致遵循着类似的规则:1)虚表指针,

9、偏移表指针, 数据成员2)原数据成员, 新增数据成员3)原虚函数,新增的虚函数2.3 其他情况上面大致描述了一些基本框架情况,在此基础上还可以有其他的变形。比如:1) 多重继承中,A,B C A没有虚函数,B有虚函数这对内存空间布局的影响 B的虚表指针,B的数据成员,A的数据成员,C新增的数据成员2) 单单两个类间的虚继承A virtual Ba)无虚函数的情况B的偏移表指针B新增的数据成员虚基类A的数据成员b)有虚函数的情况 这还要看是否发生覆盖,如果没有覆盖:虚基类A的虚表指针 如果有了覆盖: B的偏移指针分割其他不再详述。2.4 覆盖、新增在虚继承中,有分割这么一说用0x00000000来分割非虚基类和虚基类。但是,分割是否出现,这还取决于是否新增了虚函数。其实,对于虚函数,都存在覆盖和新增的视角处理。这涉及到对虚表的更新处理。2.5 本类的虚表可以这么说,在继承中是不存在本类的虚表这么一说的。都是在其基类的虚表基础之上,或进行覆盖,或进行新增。当然了,一般的,新增的虚函数地址,是存放在第一个基类虚表里的。2.6 偏移表,虚表偏移表中一般两项,第二项用于本类对虚基类的定位,是偏移相关。而第一项,好像是本类的虚表相对于本类偏移表的偏移。当本类没有虚表时,第一项就是0。当本类的虚表在偏移之上时,该值为负,刚好是它们间的差值。 (一般如此)为正的情况呢?

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1