如何通過函式名獲取虛函式的位址?

2021-09-01 20:37:40 字數 1288 閱讀 3420

測試環境: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 void(cbase::*pfun)();

int main(void)

輸出:

既然能夠正常輸出,我們有理由相信&cbase::f,&cbase::g,&cbase::h,是虛函式表裡的位址,事實是這樣嗎?

有些書上說是獲取到虛函式在虛函式表中的索引。但是實際上vs編譯器並不是這麼做的,獲取到的將會是乙個用於虛函式呼叫的位址,這個位址上的指令會先獲取虛函式表,然後再通過虛函式表獲取虛函式位址相關的項。而gcc的做法又跟vs不同,通過&獲取得的值都是1。總而言之,通過取位址&符號獲得的不是函式位址,但是可以通過獲得的值成功呼叫該函式。

但在vs中,成員函式指標不是指向函式的真實位址,而是先指向乙個位置,該位置會呼叫cbase::`vcall'':之後才跳轉到真正位址。不同的函式,cbase::`vcall'':中的數字不同。

本質上還是編譯時確定好每個函式的位置,通過此位置來查詢虛函式表。

而在vs中,*(int*)*(int*)(&b)也依舊取不到虛函式表位址

可見經過了一次jmp

為什麼會jmp,其實和普通函式一樣

#include #include using namespace std;

class base

virtual void funbase() };

class basesec

virtual void funsec() };

class child: public base, public basesec

virtual void fun() };

int main(void)

c 虛函式位址的獲取

最近在做的乙個專案的乙個步驟找到虛函式的實際位址。這個過程中遇到的問題,讓我感覺到了自己對於c 指標的理解還是不夠透徹,記錄一下。指標賦值 根據作業系統的位數定義指標的大小 ifdef 32 代表是32位作業系統 typedef unsigned int pointer size else type...

C 知識積累 如何獲取虛函式表以及虛函式位址

如果乙個類中存在虛函式的話,那麼編譯器就會為這個類生成乙個虛函式表,這個虛函式表中按照個虛函式的宣告順序存放了各個虛函式的位址,需要注意的是,這個虛函式表並不存在於類中,而對於這個類的每個物件,編譯器都會為其生成乙個透明不可見的指標,這個指標就是虛函式表指標,位於該物件記憶體中的開頭,並指向了虛函式...

C 虛函式 虛函式表位址

總結自 編譯器 vs2017 一 虛函式 當我們使用基類的引用或者指標呼叫乙個虛成員函式時會執行動態繫結,直到執行時才知道到底呼叫了哪個版本的虛函式,被呼叫的函式是與繫結到指標或者引用上的物件的動態型別相匹配的那乙個。所有虛函式都必須有定義。虛函式的作用主要是實現多型機制。using namespa...