成员函数指针有多态的效果吗?

这几天用bind的时候想到一个问题,成员函数指针有多态的效果吗?

我一直以为没有,测试之后发现是可以的,我对成员函数指针的理解有误

虚成员函数指针的调用过程是先调用函数vcall,vcall根据this寻址虚函数表然后去调用实际的函数,对于虚表上的每个索引x的函数都是使用vcall{x}进行调用

所以同一虚函数的父类和基类的成员函数指针的值是一样的,他们都指向vall{x}

所以成员函数指针是能够实现多态的

我在http://www.cnblogs.com/mightofcode/archive/2013/03/03/2939439.html里面关于成员函数指针的部分写的有点问题

 

注意:这里说的是成员函数指针的调用过程,跟直接调用CLASS.foo() 或者PCLASS->foo()是不一样的

调用过程:

虚成员函数调用:
(pa->*ff1)();
013117FE  mov         esi,esp  
01311800  mov         ecx,dword ptr [ebp-44h]  
01311803  call        dword ptr [ebp-50h]  

调用vcall
fooA::`vcall'{4}':
0130C5EB  jmp         fooA::`vcall'{4}' (1314C70h)
  
vcall寻址虚表,找到实际函数地址
fooA::`vcall'{4}':
01314C70  mov         eax,dword ptr [ecx]  
01314C72  jmp         dword ptr [eax+4]  

 

转载于:https://www.cnblogs.com/mightofcode/archive/2013/03/31/2991823.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值