菱形繼承

菱形繼承

定義:兩個子類繼承同一個父類,而又有子類同時繼承這兩個子類。

基本介紹

  • 中文名:菱形繼承
  • 定義:使用菱形繼承時務必使用虛擬繼承
  • 定義:兩個子類繼承同一個父類
  • 程式:C++
菱形繼承,虛繼承,

菱形繼承

考慮這種情況:
classCA{};
classCB:publicCA{};
classCC:publicCA{};
這時我們需要一個CD類,它需要同時繼承CB和CC。
問題就出現了。
如果我們這樣寫:
classCD:publicCB,publicCC{};
那么我們在構造一個CD類的時候,
其結果
如下圖一所示:
圖一

即:一個CD類中有兩個CA(它的超類的對象)
這樣的情況是不合理的。此時會出現模糊調用的現象。
如何避免這種現象呢?
虛繼承就有了用武之地。
我們需要改寫CB和CC的繼承方式。
classCB:publicvirtuelCA{};
classCC:publicvirtualCA{};
其他無需修改。此時我們構造一個CD類的時候,
其順序如下:
圖一圖一
開始構造CD類,
先構造一個超類CA,然後構造CB,
在構造CC(此時不會構造CC的父類CA)
這樣一來,
CD類對象中包含的CB和CC將共享同一份CA對象。
如圖二所示

這時就不會出現模糊調用的現象了。
-----------------------------------華麗麗的分割線--------------------------------------
這個就是C++臭名昭著的多繼承。
JAVA中根本不會出現這種情況,
如果必須使用菱形繼承的時候務必使用虛擬繼承
圖二圖二

虛繼承

虛繼承 這一特性在多重繼承套用中非常有用,可以使得虛基類對於由它直接或間接派生的類來說,擁有一個共同的基類對象實例。避免由於帶有歧義的組合而產生的問題(如“菱形繼承問題”)。其原理是,間接派生類(C)穿透了其父類(上面例子中的A與B),實質上直接繼承了虛基類X。

相關詞條

熱門詞條

聯絡我們