考慮這種情況:
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中根本不會出現這種情況,
如果必須使用菱形繼承的時候無比使用虛擬繼承。