C 中虛繼承

2021-08-21 20:49:23 字數 720 閱讀 1029

虛繼承和虛函式是完全無相關的兩個概念。

虛繼承是解決c++多重繼承問題的一種手段,從不同途徑繼承來的同一基類,會在子類中存在多份拷貝。這將存在兩個問題:其一,浪費儲存空間;第二,存在二義性問題,通常可以將派生類物件的位址賦值給基類物件,實現的具體方式是,將基類指標指向繼承類(繼承類有基類的拷貝)中的基類物件的位址,但是多重繼承可能存在乙個基類的多份拷貝,這就出現了二義性。

虛繼承可以解決多種繼承前面提到的兩個問題:

虛繼承底層實現原理與編譯器相關,一般通過虛基類指標和虛基類表實現,每個虛繼承的子類都有乙個虛基類指標(占用乙個指標的儲存空間,4位元組)和虛基類表(不占用類物件的儲存空間)(需要強調的是,虛基類依舊會在子類裡面存在拷貝,只是僅僅最多存在乙份而已,並不是不在子類裡面了);當虛繼承的子類被當做父類繼承時,虛基類指標也會被繼承。

實際上,vbptr指的是虛基類表指標(virtual base table pointer),該指標指向了乙個虛基類表(virtual table),虛表中記錄了虛基類與本類的偏移位址;通過偏移位址,這樣就找到了虛基類成員,而虛繼承也不用像普通多繼承那樣維持著公共基類(虛基類)的兩份同樣的拷貝,節省了儲存空間。

在這裡我們可以對比虛函式的實現原理:他們有相似之處,都利用了虛指標(均占用類的儲存空間)和虛表(均不占用類的儲存空間)。

虛基類依舊存在繼承類中,只占用儲存空間;虛函式不占用儲存空間。

虛基類表儲存的是虛基類相對直接繼承類的偏移;而虛函式表儲存的是虛函式位址。

C 中虛繼承

在c 中多繼承時很容易產生命名衝突,即使我們很小心地將所有類中的成員變數和成員函式都命名為不同的名字,命名衝突依然有可能發生,比如典型的是菱形繼承,如下圖所示 類 a 派生出類 b 和類 c,類 d 繼承自類 b 和類 c,這個時候類 a 中的成員變數和成員函式繼承到類 d 中變成了兩份,乙份來自 ...

c 中菱形繼承 虛繼承

關於菱形繼承 相當於在c 中,分別建立四個類,動物類,羊類,駝類,羊駝類,繼承關係如圖所示。在類中只建立乙個屬性,年齡。動物類 class animal 羊類 class sheep virtualpublic animal 駝類 class tuo virtualpublic animal 羊駝類...

C 虛繼承和虛繼承

虛繼承是在多繼承中為了解決衝突而技術。學術一點來說,是指乙個指定的基類,在繼承體系結構中,將其成員資料例項共享給也從這個基類直接或間接派生的其他類。虛繼承非常有用,可以避免多繼承的歧義和多重拷貝。考慮有如下繼承結構。b和c繼承a,d多繼承b c,我們看以下 class a class b publi...