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

这几天用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/p/2991823.html