2010-11-05 61 views
3

我假設我理解「受保護繼承」的含義。然而,在與這裏的一位民衆討論這個問題之後,我現在感到有點困惑。C++ - 有關「受保護繼承」的問題

這是我在C「保護繼承」 ++

的理解假設下面的類結構。

class Base {} 
class SubClass : protected Base {} 

1>如果一個子類被定義爲「protected BaseClass」,那麼這個子類不再是BaseClass的子類。相反,BaseClass只能作爲子類的實用工具。換句話說,如果您將SubClass *轉換爲Base *,SubClass &轉換爲Base &或SubClass to Base,則應該會出現錯誤。

2>人們使用受保護繼承的主要原因是期望的子類不是基類的子類(例如,Car不是引擎的子類)。而在同一時間,SubClass想要調用基類中定義的函數。

3>有一個很好的理由,有時候您更喜歡使用受保護的繼承,而不是將成員變量定義爲基礎對象。 (但我不記得在哪種情況下)。

如果我錯了,請糾正我的意見。

謝謝

+0

[C++中私有,公共和受保護繼承之間的區別](http:// stackoverflow。COM /問題/ 860339 /差之間 - 私人 - 公共和保護的繼承,在-C) – 2010-11-05 20:05:42

回答

4

對於1 -​​仍然是Base一個子類。受保護的繼承仍然是繼承。不過,您確信自動從​​轉換爲Base是不可能的。

SubClass sub; 
Base* base(&sub); 

給出

錯誤C2243: '類型轉換':轉換 從 '子類*' 到 '基地*' 存在,但 是不可訪問

對於2和3. - 人們想要的主要原因是隱藏public/protected成員Base客戶​​。 ​​的子類仍然可以看到它們。這也將符合條件的在2最後一句,而是通過​​不允許任何其他外用Base - 與private基業完全隱藏Base子類和客戶的​​對比這一點。

0

您可能聽說過OO討論中的這些術語,IS-A(公共繼承)HAS-A(包含)。我已經聽說過這個術語是爲了保護或私有繼承「IMPLEMENTED-AS-A」。例如,您可以實現Stack類AS-AN Array,但不希望Array的公共方法暴露給Stack的客戶端。

正如您所指出的那樣,您可以使用數組作爲數據成員來實現堆棧。