C 虛函式表與記憶體模型

2022-04-10 09:42:45 字數 1081 閱讀 2623

1.虛函式

虛函式是c++實現多型的有力**,宣告虛函式只需在函式前加上virtual關鍵字,虛函式的定義不用加virtual關鍵字。

2.虛函式要點

(1)靜態成員函式不能宣告為虛函式

可以這麼理解,虛函式是個動態的概念,在執行的時候才決定呼叫哪個,而靜態函式是個靜態的概念。更加細化的解釋是,靜態函式與物件無關,不可以用物件例項呼叫,顯然是與虛函式的概念違背的。

(2)建構函式不能是虛函式

很明顯,虛函式表的建立都是在建構函式中進行的,如果建構函式是虛函式的話,就變成了雞生蛋蛋生雞的問題了。

(3)析構函式最好是虛函式

析構函式最好是虛函式,除非不想作為基類使用,宣告稱虛函式是個好習慣,這樣delete用父類指標指向的子類物件就可以自動找到子類的析構函式了。

3.虛函式表在記憶體中的構造(gcc)

虛函式表一般在物件所佔記憶體的最開始的位置。

(1)無繼承

無繼承的話討論虛函式無意義,但是需要說明的是此時虛函式按照宣告的順序擺放。

(2)一般繼承,無虛函式覆蓋

這樣的話,虛函式表中先放父類虛函式指標,再按宣告順序擺放自己的虛函式指標

(3)單繼承,有虛函式覆蓋

子類物件的虛函式表中覆蓋父類虛函式的位置放置自己的虛函式指標,其他同(2)

(4)多重繼承

多重繼承意味著有多個虛函式表,自己獨有的虛函式放置在第乙個虛函式列表的尾部。

這篇總結實際上是網上的一篇博文總結,該博文總結得非常好,所以我就摘錄了過來。

補充:4.gcc和vc中對虛函式,虛基類記憶體布局的不同

要點:在普通繼承時沒區別,單繼承時虛函式表是共享的,但是虛繼承時,vc環境下,虛函式指標時不共享的,也就意味著多乙個新的虛函式就得額外多乙個指標。

5.關於虛函式、多型、記憶體布局的乙個例子

6.多型的相關概念

比較清楚地描述了過載、隱藏、覆蓋的區別

物件記憶體模型(虛函式,虛函式表,虛指標)

從例子入手,考察如下帶有虛函式的類的物件記憶體模型 1 class a 11 12 class b a 20 21 class c b 注 在子類中出現與父類相同名稱的變數和非虛函式不是最佳實踐,這裡是為了說明其記憶體結構。其物件記憶體結構見下圖。於侯捷老師 對其分析如下 1.每個含有虛函式的類在記...

C 虛函式與虛函式表

概念 虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的,簡稱為v table。學習虛函式的作用 理解 c 實現多型的機制 解決了繼承 覆蓋的問題。以下摘抄自 http www.cppblog.com xczhang archive 2008 01 2...

C 虛函式與虛函式表

多型性可分為兩類 靜態多型和動態多型。函式過載和運算子過載實現的多型屬於靜態多型,動態多型性是通過虛函式實現的。每個含有虛函式的類有一張虛函式表 vtbl 表中每一項是乙個虛函式的位址,也就是說,虛函式表的每一項是乙個虛函式的指標。沒有虛函式的c 類,是不會有虛函式表的。兩張圖 簡單例子 1 inc...