设为首页 加入收藏

TOP

虚继承(二)
2023-07-23 13:38:48 】 浏览:118
Tags:
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 ;
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++ STL学习笔记-C++ STL基础 下一篇c++学习笔记——模板和IO(二)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目