怎样将成员函数指针强制转换成void*指针?

    技术2022-05-11  67

    采用取成员函数指针的地址的方法,先把指向成员函数指针的指针强制转化为别的类型,如unsigned*,当然同样可以通过此转化后的指针经过相反的变换来调用成员函数。于是乎要转化为void*的问题也随之可解,如下示例: /* VS2003下编译运行 */ class AbstractMethod{public: virtual void show(){}  // = 0;  // 可以是纯虚函数,这里为了测试方便不使用纯虚函数!

     void fun() {  cout << "I was called!" << endl; }

     void fun1() {  cout << "I was called!" << endl; }};

    int main(){ // 定义成员函数指针类型 typedef void (AbstractMethod::*MFP)(void);

     // 转化函数指针为别的指针 MFP mfp1 = &AbstractMethod::show;   unsigned* tmp =  (unsigned*)&mfp1; cout << hex << *tmp << endl;

     MFP mfp2 = &AbstractMethod::fun; tmp = (unsigned*)&mfp2; cout << hex << *tmp << endl;

     MFP mfp3 = &AbstractMethod::fun1; tmp = (unsigned*)&mfp3; cout << hex << *tmp << endl;

     // 通过转化后的指针调用成员函数 AbstractMethod am; MFP* addr = (MFP*)tmp; (am.*mfp3)(); (am.*(*addr))();

     return 0;}

    验证上述方法取得的成员函数地址是否正确:1. 在调试是查看临时变量函数指针的值和输出的是否一样。2. 可以根据调试时的反汇编进行结果验证。3. 最好的办法就是如上例子通过转化后的指针来调用成员函数。

    Copyright@戴维 2006.5  于北京 

     

    最新回复(0)