最近在做的乙個專案的乙個步驟找到虛函式的實際位址。這個過程中遇到的問題,讓我感覺到了自己對於c++指標的理解還是不夠透徹,記錄一下。
指標賦值
根據作業系統的位數定義指標的大小:
#ifdef _***32
//代表是32位作業系統
typedef
unsigned
int pointer_size
#else
typedef
unsigned
long
long pointer_size
#endif
我需要獲得虛表。虛表被多型物件的虛指標所指向,虛指標在多型物件的最前面。
polymorphicobject* ppo;
pointer_size* vtable =
(pointer_size*)(
*(pointer_size*
)ppo)
;
每一次型別轉換,實際上都會產生乙個臨時變數,上面複雜的式子可以拆分成:
pointer_size* temp1 = ppo;
pointer_size temp2 =
*temp1;
pointer_size* te*** = temp2;
pointer_size* vtable = te***;
前面提到,指標指向空間的大小是由指標的型別所知道的,這裡做的是
我們知道函式的宣告typedef void (__stdcall * pfunc)(void)
,要找的函式指標在虛表的index
位置,從而vtable[index]
就是目標函式指標的位址。
可此時得到的是pointer_size
型別,還需要賦值給函式指標從而進一步操作。看起來好像很複雜,實際上,根據指標賦值的第一條,直接:pfunc p = (pfunc)vtable[index]
就搞定了。
ps:寫完了才發現這麼簡單,當時是怎麼想的,可能是看到函式指標就有點陌生,指標都只是無符號數而已,都是一樣的-_-…
C 虛函式 虛函式表位址
總結自 編譯器 vs2017 一 虛函式 當我們使用基類的引用或者指標呼叫乙個虛成員函式時會執行動態繫結,直到執行時才知道到底呼叫了哪個版本的虛函式,被呼叫的函式是與繫結到指標或者引用上的物件的動態型別相匹配的那乙個。所有虛函式都必須有定義。虛函式的作用主要是實現多型機制。using namespa...
C 知識積累 如何獲取虛函式表以及虛函式位址
如果乙個類中存在虛函式的話,那麼編譯器就會為這個類生成乙個虛函式表,這個虛函式表中按照個虛函式的宣告順序存放了各個虛函式的位址,需要注意的是,這個虛函式表並不存在於類中,而對於這個類的每個物件,編譯器都會為其生成乙個透明不可見的指標,這個指標就是虛函式表指標,位於該物件記憶體中的開頭,並指向了虛函式...
如何通過函式名獲取虛函式的位址?
測試環境 win8 vs2012 include include using namespace std class cbase virtual void f virtual void g virtual void h private int x typedef void fun typedef v...