熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

怎樣將成員函數指針強制轉換成void*指針?

2022-06-13   來源: .NET編程 

  采用取成員函數指針的地址的方法先把指向成員函數指針的指針強制轉化為別的類型如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@戴維   於北京 


From:http://tw.wingwit.com/Article/program/net/201311/13364.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.