如何成员函数指针强制转换成void*指针
时间:2007-04-14 00:00:00
来源: 作者: 编辑:gaopoadmin
采用取成员函数指针的地址的方法,先把指向成员函数指针的指针强制转化为别的类型,如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. 最好的办法就是如上例子通过转化后的指针来调用成员函数。
文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面