这几天用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] 调用vcallfooA::`vcall'{4}':0130C5EB jmp fooA::`vcall'{4}' (1314C70h) vcall寻址虚表,找到实际函数地址fooA::`vcall'{4}':01314C70 mov eax,dword ptr [ecx] 01314C72 jmp dword ptr [eax+4]