虚函数的识别2

1.虚函数调用过程:

void ShowSpeak(CPerson * pPerson)
    pPerson->ShowSpeak();
00407CFE 8B 45 08             mov         eax,dword ptr [pPerson]  
00407D01 8B 10                mov         edx,dword ptr [eax]       ;取虚表首地址
00407D03 8B F4                mov         esi,esp  
00407D05 8B 4D 08             mov         ecx,dword ptr [pPerson]   ;设置this指针
;利用虚表指针edx,间接调用函数。由于ShowSpeak在父类中是第二个声明的虚函数,所以这里用edx+4  
00407D08 8B 42 04             mov         eax,dword ptr [edx+4] 
00407D0B FF D0                call        eax  

2.构造函数和析构函数中调用虚函数

构造函数:
    CChinese Chinese;
00407FAD 8D 4D EC             lea         ecx,[Chinese]  
00407FB0 E8 15 B7 FF FF       call        CChinese::CChinese (04036CAh)  

CChinese::CChinese:
004036CA E9 71 40 00 00       jmp         CChinese::CChinese (0407740h)  

    CChinese(){}
0040775F 59                   pop         ecx  
00407760 89 4D F8             mov         dword ptr [this],ecx  
00407763 8B 4D F8             mov         ecx,dword ptr [this]  
00407766 E8 BE B0 FF FF       call        CPerson::CPerson (0402829h)  
0040776B 8B 45 F8             mov         eax,dword ptr [this]  
0040776E C7 00 74 8E 49 00    mov         dword ptr [eax],offset CChinese::`vftable' (0498E74h)  
00407774 8B 45 F8             mov         eax,dword ptr [this]  

CPerson::CPerson:
00402829 E9 D2 4F 00 00       jmp         CPerson::CPerson (0407800h)  

CPerson(){
0040781F 59                   pop         ecx  
00407820 89 4D F8             mov         dword ptr [this],ecx  
00407823 8B 45 F8             mov         eax,dword ptr [this]  
00407826 C7 00 54 8E 49 00    mov         dword ptr [eax],offset CPerson::`vftable' (0498E54h)  
        ShowSpeak();
0040782C 8B 4D F8             mov         ecx,dword ptr [this]  ;虚表是父类的,可以直接调用父类虚函数
0040782F E8 A1 9A FF FF       call        CPerson::ShowSpeak (04012D5h)  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值