C++ 继承关系( 含虚函数) 内存结构分析以及动态绑定的细节分析一. 说明本文较为深入的研究 C++ 的继承( 含多重继承) 情况下带虚函数时的实例内存结构,较为深入的剖析了继承实例间是如何组织的,以及动态绑定的实现细节。二. 依据以下阐述的细节均依据 VS2005 生成的 DEBU G模式程序在 IDA Pro5. 2反编译所得,部分数据结构根据程序分析得出。三. 术语说明对于以下将频繁用到的术语,我可能简写为如下 classX:RTTI_COL x 原语: classX:plete Object Locator {for x} classX:RTTI_CHD 原语: classX:RTTI class Hierarchy Descriptor classX:RTTI_BCD 原语: classX:RTTI Base class Descriptor 以上简写均采用单词首字母缩写, 其中 Derive 表示派生类,x 表示 Derive 的一个基类, classX 表示以上任意类四. 分析 1. 派生类内存分布及虚表 Figure 1: 派生类实例对象内存分布及虚表映射如上图, 其中左部为派生类 class 的实例对象内存格局( 继承来自 A,B ), 其中第一项为 base A 的虚表地址(A,B 数据在 class 实例中布局顺序是按照 Derive 在声明时继承顺序决定 Derive :RTTI_COL x virtual Derive::fun1(overwrite by derive class) for base A virtual A::fun2( inherit from base A) for base A...... virtual fun(if derive own virtual itslef) for derive * perhaps not vfTable for base A data of base A vfTable for base B data of base B data of Derive itself 的), 从图中箭头可知 base A 的虚表地址指向了一个数组, 里面存放了 Derive 对应的虚函数地址: ①首先存放重写过的 base A 声明的的虚函数地址( 如果虚函数是从基类继承过来的,那么虚表中存放的也是 base A 中该函数地址)。②然后存放 Derive 自己声明的虚函数( 可能没有)。* 注意: vfTable 地址指向的虚表是从右边表格黄色以下位置开始, 黄色以上是虚表附加信息,不为虚表所有,为本人 IDA Pro 反汇编分析所得。其中 Derive :RTTI_COL x 是定位对象所使用的相关数据结构,其结构经反汇编如下: 2. classX : pl ete Object Locator {for x} Field Length Remark reserve _1 4 not used,filled with 0x00 offset_x 4 the offset of vfTable( for x) and the base address of classX reserve _3 4 not used,filled with 0x00 pTypeDescriptor 4 a
c++继承关系(含虚函数) 内存结构分析 来自淘豆网www.taodocs.com转载请标明出处.