回覆列表
-
1 # xcbeyond
-
2 # 人到中年從心編碼
這個問題,java之父曾經回答過,設計java語言的初衷就是要設計一門更加簡單的語言,所以java的設計遮蔽了一些負載的東西,其中就包括指標和多繼承。為什麼說多繼承複雜呢?這就要說一個多繼承的菱形繼承問題(又叫鑽石繼承)。
菱形繼承(鑽石繼承)那麼菱形繼承有什麼問題?
資源浪費:行動電話繼承了多份父類(硬體)的屬性(getCreateTime()的引用);
二義性:行動電話的getId無法確定是返回imei還是mac地址。
那麼c++中如何解決這個問題?有兩種解決辦法:
1. 透過域限定來訪問,能夠解決二義性問題,例如
行動電話 d = 行動電話()d.網路裝置::idd.電話::id2. 透過虛繼承,能夠解決資源浪費和部分二義性問題,例如
class 電話:virtual public 硬體{}class 網路裝置:virtual public 硬體{}行動電話 d = new 行動電話()d.id//這時候訪問的是硬體::id較真的朋友可能會問,如果重名的屬性不在硬體類裡面定義會怎麼樣?是的,如果上述例子的硬體類並沒有定義id,那麼二義性依然存在並導致編譯無法透過,所以虛繼承為什麼說只是部分解決二義性問題。
是不是很複雜?所以java直接捨棄多繼承,避免這種二義性,改用多實現介面的方式代替,因為即使介面的方法重複了,多實現裡面要求實現類自己去實現方法,也就是相當於強制要求實現類去覆蓋同名屬性,解決二義性問題。
Java中支援單繼承,多實現。
如果支援多繼承,那麼指一個子類能同時繼承於多個父類,從而同時擁有多個父類的特徵,若子類繼承的父類中擁有相同的成員變數,子類在引用該變數時將無法判別使用哪個父類的成員變數,因此多繼承是存在爭議的,是不能多繼承的。
通俗點來將,一個人不可能是擁有多個父親或母親的。