{
public:
void sayhello()
{
cout << "hello A" << endl;
}
private:
};
class B
{
public:
virtual void sayhello()
{
cout << "hello B" << endl;
}
private:
};
int main()
{
A *pa = NULL;
pa->sayhello();
B *pb = NULL;
pb->sayhello();
system("pause");
return 0;
}
如上代码,最近面试碰到题目。第一个调用可以正常输出,第二个却是失败的。
以下是是生成的汇编代码:
_main PROC ; COMDAT
; 34 : {
push ebp
mov ebp, esp
sub esp, 216 ; 000000d8H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-216]
mov ecx, 54 ; 00000036H
mov eax, -858993460 ; ccccccccH
rep stosd
; 35 : A *pa = NULL;
mov DWORD PTR _pa$[ebp], 0
; 36 : pa->sayhello();
mov ecx, DWORD PTR _pa$[ebp]
call ?sayhello@A@@QAEXXZ ; A::sayhello
; 37 :
; 38 : B *pb = NULL;
mov DWORD PTR _pb$[ebp], 0
; 39 : pb->sayhello();
mov eax, DWORD PTR _pb$[ebp]
mov edx, DWORD PTR [eax]
mov esi, esp
mov ecx, DWORD PTR _pb$[ebp]
mov eax, DWORD PTR [edx]
call eax
cmp esi, esp
call __RTC_CheckEsp
pb->sayhello(); 调用没有找到相应的函数地址