401060 mov edx, [ebp-14h]
00401063 push edx ;参数2:p1
00401064 push offset aPPP ;参数1:"%p %p %p\n"
00401069 call sub_401650 ;调用printf函数
0040106E add esp, 10h
00401071 mov dword ptr [ebp-18h], 0
00401078 lea ecx, [ebp-40h] ;传递this指针
0040107B call sub_4013E0 ;调用析构代理函数 ⑥
00401080 mov eax, [ebp-18h]
00401083 mov esp, ebp
00401085 pop ebp
00401086 retn
;虚继承结构的子类构造
004011D0 push ebp
004011D1 mov ebp, esp
004011D3 sub esp, 8
004011D6 mov [ebp-4], ecx
004011D9 mov dword ptr [ebp-8], 0
004011E0 cmp dword ptr [ebp+8], 0 ;比较参数是否为0,为0则执行跳转,防止重复构造虚基类
004011E4 jz short loc_401209
004011E6 mov eax, [ebp-4]
004011E9 mov dword ptr [eax+4], offset unk_4122B0 ;设置父类Sofa中的虚基类偏移表 ②
004011F0 mov ecx, [ebp-4]
004011F3 mov dword ptr [ecx+10h], offset unk_4122B8;设置父类Bed中的虚基类偏移表 ③
004011FA mov ecx, [ebp-4]
004011FD add ecx, 20h ;调整this指针为虚基类this指针
00401200 call sub_401120 ;调用虚基类构造函数 ④
00401205 or dword ptr [ebp-8], 1
00401209 push 0 ;传入0作为构造标记
0040120B mov ecx, [ebp-4] ;获取Sofa对象首地址作为this指针
0040120E call sub_401150 ;调用父类Sofa构造函数 ⑤
00401213 push 0 ;传入0作为构造标记
00401215 mov ecx, [ebp-4] ;调整this指针
00401218 add ecx, 0Ch ;获取Bed对象首地址作为this指针
0040121B call sub_401090 ;调用父类Bed构造函数 ⑥
00401220 mov edx, [ebp-4]
00401223 mov dword ptr [edx], offset ??_7SofaBed@@6B@ ;覆盖Sofa类虚表指针(新) ⑦
00401229 mov eax, [ebp-4]
0040122C mov dword ptr [eax+0Ch], offset ??_7SofaBed@@6B@_0 ;覆盖Bed类虚表指针(新) ⑧
00401233 mov ecx, [ebp-4] ;通过this指针和虚基类偏移表定位到虚基类的虚表指针
00401236 mov edx, [ecx+4] ;虚基类偏移表给edx
00401239 mov eax, [edx+4] ;虚基类虚表指针相对于虚基类偏移表的偏移给eax
0040123C mov ecx, [ebp-4] ;获取this指针
0040123F mov dword ptr [ecx+eax+4], offset ??_7SofaBed@@6B@_1;覆盖Furniture类虚表指针(新) ⑨
00401247 push offset aSofabedSofabed;"SofaBed::SofaBed()\n"
0040124C call sub_401650 ;调用printf函数
00401251 add esp, 4
00401254 mov edx, [ebp-4]
00401257 mov dword ptr [edx+1Ch], 6;height = 6
0040125E mov eax, [ebp-4]
00401261 mov esp, ebp
00401263 pop ebp
00401264 retn 4
;子类析构代理函数
004013E0 push ebp ;析构代理函数
004013E1 mov ebp, esp
004013E3 push ecx
004013E4 mov [ebp-4], ecx
004013E7 mov ecx, [ebp-4]
004013EA add ecx, 20h
004013ED call sub_401320 ;调用SofaBed的析构函数
004013F2 mov ecx, [ebp-4]
004013F5 add ecx, 20h ;调整this指针为虚基类
004013F8 call sub_4012B0 ;调用虚基类的析构函数
004013FD mov esp, ebp
004013FF pop ebp
00401400 retn
;子类的析构函数
00401320 push ebp
00401321 mov ebp, esp
00401323 push ecx
00401324 mov [ebp-4], ecx
00401327 mov eax, [ebp-4] ;调整this指针为Sofa,还原虚表指针为SofaBed
0040132A mov dword ptr [eax-20h], offset ??_7SofaBed@@6B@
00401331 mov ecx, [ebp-4] ;调整this指针为Bed,还原虚表指针为SofaBed
00401334 mov dword ptr [ecx-14h], offset ??_7SofaBed@@6B@_0
0040133B mov edx, [ebp-4]
0040133E mov eax, [edx-1Ch]
00401341 mov ecx, [eax+4] ;从虚基类偏移表中获取虚基类偏移
00401344 mov edx, [ebp-4]
;调整this指针为虚基类,还原虚表指针为SofaBed,到此为止,3个虚表指针还原完毕,执行析构函数内的代码
00401347 mov dword ptr [edx+ecx-1Ch], offset ??_7SofaBed@@6B@_1
0040134F push offset aSofabedSofabed_0;"SofaBed::~SofaBed()\n"
00401354 call sub_401650 ;调用printf函数
00401359 add esp, 4
0040135C mov ecx, [ebp-4]
0040135F sub ecx, 4 ;调整this指针为Bed
00401362 call sub_401270 ;调用父类Bed析构函数
00401367 mov ecx, [ebp-4]
0040136A sub ecx, 14h ;调整this指针为Sofa
0040136D call sub_4012E0 ;调用父类Sofa析构函数
00401372 mov esp, ebp
00401374 pop ebp
00401375 retn
;Sofe类虚基类偏移表
.rdata:004122B0 dword_4122B0 dd 0FFFFFFFCh ;-4,虚基类偏移表所属类对应的对象首地址相对于虚基类偏移表的偏移值
.rdata:004122B4 dd 1Ch ; |