如何獲取C++類成員虛函數(shù)地址的示例代碼
本文主要給大家介紹了關(guān)于如何獲取C++類成員虛函數(shù)地址的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),話不多說了,來一起看看詳細(xì)的介紹:
1.GCC平臺
GCC平臺獲取C++成員虛函數(shù)地址可使用如下方法[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++平臺
可以采用內(nèi)聯(lián)匯編的方式獲取[2],代碼如下:
#define ShowFuncAddress(function) _asm{\
mov eax, function}\
_asm{mov p,eax}\
cout<<"Address of "#function": "<<p<<endl;
//使用示例
ShowFuncAddress(Base::f1);
上面的代碼在VS2015中編譯通過。
3.通過訪問虛函數(shù)表獲取虛函數(shù)地址
下面的代碼可以在GCC和Visual C++共同編譯運(yùn)行。
/**********************
@className:類名稱
@pObj:類對象地址
@index:虛函數(shù)表項(xiàng)(從0開始)
**********************/
void showVtableContent(char* className, void* pObj, int index){
unsigned long* pAddr=NULL;
pAddr=reinterpret_cast<unsigned long*>(pObj);
pAddr=(unsigned long*)*pAddr; //獲取虛函數(shù)表指針
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); //輸出第一個虛函數(shù)Base::f1的地址
showVtableContent("Base",&b,1); //輸出第二個虛函數(shù)Base::f2的地址
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
參考文獻(xiàn)
相關(guān)文章
C++ DLL實(shí)現(xiàn)循環(huán)播放音樂的示例詳解
這篇文章主要為大家詳細(xì)介紹了C++ DLL實(shí)現(xiàn)循環(huán)播放音樂的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解下2024-03-03
C++使用chrono庫處理日期和時間的實(shí)現(xiàn)方法
C++11 中提供了日期和時間相關(guān)的庫 chrono,通過 chrono 庫可以很方便地處理日期和時間,本文主要介紹了C++使用chrono庫處理日期和時間的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2021-09-09
c/c++ 標(biāo)準(zhǔn)庫 bind 函數(shù)詳解
bind是一組用于函數(shù)綁定的模板。在對某個函數(shù)進(jìn)行綁定時,可以指定部分參數(shù)或全部參數(shù),也可以不指定任何參數(shù),還可以調(diào)整各個參數(shù)間的順序。這篇文章主要介紹了c/c++ 標(biāo)準(zhǔn)庫 bind 函數(shù) ,需要的朋友可以參考下2018-09-09
FFmpeg實(shí)現(xiàn)變速播放的兩種方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了FFmpeg中實(shí)現(xiàn)變速播放的兩種方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的可以了解一下2023-07-07
win10環(huán)境下vscode Linux C++開發(fā)代碼自動提示配置(基于WSL)
這篇文章主要介紹了win10環(huán)境下vscode Linux C++開發(fā)代碼自動提示配置(基于WSL),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

