C 虛函式表

2021-06-16 16:23:05 字數 1043 閱讀 7270

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

1. 虛函式與虛函式表基本知識

這裡有一篇介紹,只需看前兩頁,各種配圖,很形象:

這篇文章則更精練,只需看第一段就好:

總的來說,每乙個擁有virtual function的類例項化物件時,都會額外申請一塊記憶體儲存虛函式表儲存所有虛函式位址,並在物件某個位置儲存乙個vptr指標指向該錶起始位址。這個指標具體放在什麼位置,虛函式表怎麼組織,怎麼索引各個虛函式,這些都是編譯器在編譯期間決定的,在不同編譯環境下不見得相同。

2. 多型子類的呼叫順序 -- 為什麼不要在建構函式中呼叫虛函式

原因是,在子類的建構函式執行時,虛函式表還沒有被子類覆蓋,換句話說,此時呼叫的函式是當前類的函式,虛函式機制在建構函式中無法觸發。其原因在於子類構造時各個初始化步驟的呼叫順序:

全部推演過程見此:

直接摘錄構造順序:

1.構造子類建構函式的引數

2.子類呼叫基類建構函式

3.基類設定vptr

4.基類初始化列表內容進行構造

5.基類函式體呼叫

6.子類設定vptr

7.子類初始化列表內容進行構造

8.子類建構函式體呼叫

(注意一點,初始化列表內的資料不按書寫順序,而是按類內部的定義順序)

析構的順序恰好相反,所以也不要在析構函式中呼叫虛函式,那樣也是沒有意義的。

3. 如何去驗證虛函式表的存在

其實在第乙個鏈結裡已經有了示例程式。

如果你看不懂函式指標,請看這裡:

4. 為什麼建構函式不能是虛函式

從設計理念上說,建構函式不需要是虛函式;從當前vptr的實現機制上說,無法實現虛的建構函式。

詳細可見這裡:

C 虛函式表

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

C 虛函式表

c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術,...

C 虛函式表

解析c 的虛函式表 c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtt...