91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

如何獲取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

合江县| 科技| 阿城市| 丹巴县| 卢氏县| 龙泉市| 马尔康县| 那坡县| 民丰县| 读书| 肥乡县| 瓮安县| 万源市| 东莞市| 蛟河市| 屏边| 镇原县| 海门市| 四会市| 杂多县| 胶南市| 财经| 张掖市| 尚义县| 怀安县| 瓦房店市| 青州市| 松江区| 上栗县| 青阳县| 百色市| 利辛县| 安平县| 靖远县| 冀州市| 玛沁县| 鱼台县| 名山县| 调兵山市| 宣化县| 洛阳市|