采用取成员函数指针的地址的方法先把指向成员函数指针的指针强制转化为别的类型如unsigned*当然同样可以通过此转化后的指针经过相反的变换来调用成员函数于是乎要转化为void*的问题也随之可解如下示例 /* VS下编译运行 */ class AbstractMethod { public: virtual void show(){} // = ; // 可以是纯虚函数这里为了测试方便不使用纯虚函数! void fun() { cout << I was called! << endl; } void fun() { cout << I was called! << endl; } }; int main() { // 定义成员函数指针类型 typedef void (AbstractMethod::*MFP)(void); // 转化函数指针为别的指针 MFP mfp = &AbstractMethod::show; unsigned* tmp = (unsigned*)&mfp; cout << hex << *tmp << endl; MFP mfp = &AbstractMethod::fun; tmp = (unsigned*)&mfp; cout << hex << *tmp << endl; MFP mfp = &AbstractMethod::fun; tmp = (unsigned*)&mfp; cout << hex << *tmp << endl; // 通过转化后的指针调用成员函数 AbstractMethod am; MFP* addr = (MFP*)tmp; (am*mfp)(); (am*(*addr))(); return ; } 验证上述方法取得的成员函数地址是否正确 在调试是查看临时变量函数指针的值和输出的是否一样 可以根据调试时的反汇编进行结果验证 最好的办法就是如上例子通过转化后的指针来调用成员函数 Copyright@戴维 于北京 |