C 虛函式表 存在哪

2021-08-20 14:32:59 字數 927 閱讀 6758

**

c++通過虛函式實現多型。那麼虛函式表具體儲存在哪?是每乙個物件都有虛函式表,還是每一類有虛函式表?讓我們通過**分析一下。**執行在windows平台,使用visual studio2010編譯。

虛函式基礎知識

c++中,乙個類存在虛函式,那麼編譯器就會為這個類生成乙個虛函式表,在虛函式表裡存放的是這個類所有虛函式的位址。當生成類物件的時候,編譯器會自動的將類物件的前四個位元組設定為虛表的位址,而這四個位元組就可以看作是乙個指向虛函式表的指標。虛函式表可以看做乙個函式指標陣列。

**分析

class base

};class derived:public base

};int main()

**分別列印出,基類物件,子類物件,以及指向子類的基類指標的虛函式表相對於程序基址的偏移,結果如下圖

這裡寫描述

這裡可以看出,虛函式表是屬於類,類的所有物件共享這個類的虛函式表。並且,子類物件與指向子類的基類指標指向的物件,使用同乙個虛函式表,符合c++的多型要求。

隨後,使用pe工具,開啟**生成的exe檔案,各個section的偏移位址如下圖

這裡寫描述

剛才虛函式表的相對偏移位址為0x000183e8和0x00017834,屬於.rdata段。由此可見,虛函式表儲存在程序的唯讀資料段。

結論

虛函式表屬於類,類的所有物件共享這個類的虛函式表。

虛函式表由編譯器在編譯時生成,儲存在.rdata唯讀資料段。

C 虛函式表 存在哪

c 通過虛函式實現多型。那麼虛函式表具體儲存在哪?是每乙個物件都有虛函式表,還是每一類有虛函式表?讓我們通過 分析一下。執行在windows平台,使用visual studio2010編譯。c 中,乙個類存在虛函式,那麼編譯器就會為這個類生成乙個虛函式表,在虛函式表裡存放的是這個類所有虛函式的位址。...

C 虛函式表

考慮最簡單的有虛函式的繼承關係 class f class s public f 此時,我們可以定義乙個父類的指標,實際指向乙個子類的物件。呼叫func函式的結果是子類的函式。虛函式在這裡是動態繫結的。f f new s f func 輸出s func 我們知道子類即使不定義虛函式也會繼承該虛函式表...

C 虛函式表

一般來說,對於開發者我們只需要知道虛函式的使用方法,以及虛函式表的存在即可。但面試時往往會遇到更細節的問題,比如讓你實現乙個虛函式機制,雖然不太實用,總歸了解些底層知識也是件好事。但如果有人苦苦相逼一定要拿這個刷人,你就去罵他吧,你才是寫編譯器的,你們全家都是寫編譯器的。唉,我有些失態了.1.虛函式...