C 虛函式表小記

2021-07-10 22:31:38 字數 639 閱讀 7647

最近在讀c++ primer plus,看到了關於虛函式表的部分,覺得應該記錄一下。

c++只是規定了虛函式應該如何做,但是具體的實現是編譯器來負責的。

通常編譯器是通過向物件新增乙個隱藏的成員來操作虛函式,這個隱藏的成員是乙個指向陣列的指標,這個陣列的內容是方法的位址。這個陣列通常叫做「虛表」(virtual function table)。這個虛表託管的是這個類所有虛函式的位址。例如,乙個基類的物件包含乙個指向這個類所有虛函式位址的陣列的指標。如果派生類重寫了虛函式,則派生類物件的虛表中相應的位址就變成重寫後函式的位址。如果派生類沒有重寫虛函式,則虛表中的位址不變。如果派生類提供了乙個新的虛函式,則它的位址會被新增到虛表中。

當你呼叫虛函式時,程式就會根據虛表位址去相應的虛表中去查詢虛函式,獲得虛函式的位址後呼叫虛函式。

可以看下圖幫助理解。

但是,使用虛函式在記憶體和執行速度上還是有一些成本的。主要在如下幾方面:

1、每乙個物件的大小會因為要儲存虛函式的位址而相應增加一些。

2、對於每乙個類,編譯器要建立乙個虛函式位址表

3、對於每乙個虛函式的呼叫,需要額外的步驟去查詢虛表來獲得位址。

C 虛函式表

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

C 虛函式表

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

C 虛函式表

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