日期:2014-05-17  浏览次数:21074 次

怎样将成员函数指针强制转换成void*指针?
采用取成员函数指针的地址的方法,先把指向成员函数指针的指针强制转化为别的类型,如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.   最好的办法就是如上例子通过转化后的指针来调用成员函数。  


转http://www.webasp.net/article/29/28141.htm

------解决方案--------------------
sf
------解决方案--------------------
up
------解决方案--------------------
学习...
------解决方案--------------------
楼主发错地方了。