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 eax2.构造函数和析构函数中调用虚函数
构造函数: 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)