中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何獲取C++類成員虛函數地址的示例代碼

發布時間:2020-09-27 17:43:53 來源:腳本之家 閱讀:227 作者:Dablelv 欄目:編程語言

本文主要給大家介紹了關于如何獲取C++類成員虛函數地址的相關內容,分享出來供大家參考學習,話不多說了,來一起看看詳細的介紹:

1.GCC平臺

GCC平臺獲取C++成員虛函數地址可使用如下方法[1]:

class Base{
 int i;
public:
 virtual void f1(){
  cout<<"Base's f1()"<<endl;
 }
};

Base b;
void (Base::*mfp)() = &Base::f1;
printf("address: %p", (void*)(b->*mfp));

上面的代碼在Linux g++ (GCC) 4.8.5中編譯通過。

2.Visual C++平臺

可以采用內聯匯編的方式獲取[2],代碼如下:

#define ShowFuncAddress(function) _asm{\
 mov eax, function}\
 _asm{mov p,eax}\
 cout<<"Address of "#function": "<<p<<endl;

//使用示例
ShowFuncAddress(Base::f1);

上面的代碼在VS2015中編譯通過。

3.通過訪問虛函數表獲取虛函數地址

下面的代碼可以在GCC和Visual C++共同編譯運行。

/**********************
@className:類名稱
@pObj:類對象地址
@index:虛函數表項(從0開始)
**********************/
void showVtableContent(char* className, void* pObj, int index){
 unsigned long* pAddr=NULL;
 pAddr=reinterpret_cast<unsigned long*>(pObj);
 pAddr=(unsigned long*)*pAddr;  //獲取虛函數表指針
 cout<<className<<"'s vtable["<<index<<"]";
 cout<<": 0x"<<(void*)pAddr[index]<<endl;
}

//使用示例:
class Base{
 int i;
public:
 virtual void f1(){
  cout<<"Base's f1()"<<endl;
 }
 virtual void f2(){
  cout<<"Base's f2()"<<endl;
 }
};

Base b;
showVtableContent("Base",&b,0); //輸出第一個虛函數Base::f1的地址
showVtableContent("Base",&b,1); //輸出第二個虛函數Base::f2的地址

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

參考文獻

[1]print address of virtual member function

[2]動態聯編實現原理分析

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿拉尔市| 西安市| 凌云县| 海伦市| 平舆县| 九寨沟县| 简阳市| 广安市| 广州市| 石台县| 正镶白旗| 西青区| 双峰县| 休宁县| 清徐县| 四川省| 泰来县| 永春县| 铅山县| 偃师市| 梁山县| 湖北省| 邳州市| 肇东市| 镶黄旗| 八宿县| 德兴市| 淮安市| 昌图县| 张掖市| 汝南县| 富川| 铜梁县| 南陵县| 中西区| 水城县| 方城县| 温泉县| 普兰店市| 旺苍县| 闻喜县|