如何成员函数指针强制转换成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 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面