关于虚函数的面试题

class A
{
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(); 调用没有找到相应的函数地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值