2013-11-28 42 views
10

公有繼承很容易。受保護繼承的實際用途是什麼?

答:公共B意味着每個A都是B.在大多數編程語言中,像vb.net和objective-c,這是唯一的繼承類型。

私有繼承也很容易,但毫無意義

答:私人B表示A由B.實現。然而,這是沒有意義的,因爲這意味着A應該所含的B來代替。所有權意味着更少的耦合,沒有缺點。

然後我們保護繼承。

任何人都可以向我解釋這到底是什麼?有人說這是「作爲一種關係」。在這方面我還不是很清楚。

有沒有人有一些樣本情況下人們使用良好的模式(和良知)保護繼承實際生產使用?

+0

我可能是錯的,但我想我讀了一本金色C++書籍(不記得是哪一本),受保護的繼承是(幾乎?)胡說八道,幾乎沒有用過。像「保留供將來使用」一樣。但是,再次,我可能會說謊:) –

+0

[這個答案](http://stackoverflow.com/a/1374362/2513200)約翰內斯紹布實際上發現了一個用例。它仍然稱它「非常有用」。 – Hulk

+0

或嘗試[這一個](http://stackoverflow.com/questions/374399/why-do-we-actually-need-private-or-protected-inheritance-in-c/374423#374423) – neutrino

回答

10

私有繼承也很容易,但毫無意義

答:私人B表示A由B.實現。然而,這是沒有意義的,因爲這意味着A應該所含的B來代替。所有權意味着更少的耦合,沒有缺點。

你可能看不到私有繼承的原因並不意味着它沒有意義。 有幾種情況下,私人繼承有它的原因。乍看之下,你是對的,私有繼承意味着 - 就像聚集一樣的關係,並且私有繼承具有(稍微)更緊密的耦合。

原因在aggretations利於私有繼承可能是以下一些:

  • 隨着你繼承的typedef以及私有繼承。在某些情況下(例如特徵類)私有繼承只是在基類中重新輸入typedef的替代方法。
  • 在很少的情況下,你必須在之前初始化一個成員一個「真正的」(即公共)基類。實現這一目標的唯一方法是使該成員成爲在公共基礎之前繼承的私有基類。
  • 有時您需要訪問成員的受保護成員。如果您無法自己更改成員類,則必須使用私有繼承來訪問它們。
  • 如果一個成員沒有自己的數據成員,它仍佔用空間。使它成爲一個私有基類可以實現空基類的優化,從而縮小班級對象的大小。
  • 甚至更​​多的點,看到詹姆斯的下面

評論這些理由顯然是技術方面的原因,有些人甚至會說‘黑客’。然而,這樣的理由存在,所以私人繼承並不完全沒有意義。這不僅僅是「純粹的OO風格」,而且C++也不是純粹的OO語言。

之所以保護繼承是非常簡單的,一旦你瞭解了私有繼承的那些:

如果你有理由繼承的東西私下想使這些利益(即想成爲會員您類或類型定義)可以被派生類訪問,使用受保護的繼承。顯然,應該很少使用私有繼承,並且更加保護繼承。

+1

值得指出的是,最初的繼承,比如Smalltalk,更接近於私有繼承,而不是C++中的公有。繼承最初設計爲支持共享實現,_not_共享接口。 –

+4

當然,您已經錯過了私有繼承最常見的原因:基類使用模板方法模式提供可定製的實現,並且必須覆蓋其虛函數。 –

+4

更不用說,有時候,您實現特定接口的事實是您客戶的實現細節。 GUI小部件是一個GUI事件監聽器的事實只涉及小部件本身(以及它爲事件引用的地方)。 –

4

受保護遺傳的主要動機是正交性。 在所有其他情況下,您有三個不同的訪問控制: 私人,受保護和公共。爲什麼繼承應該是 不同?在實踐中,人們可能會認爲沒有必要使用 或通常用於受保護的訪問。這可能會誇大 這種情況,但可以確定的是,私人或公共場所的保護比 要少得多。

此外,私有繼承並非毫無意義,實際上, 對應於原來的繼承使用。只要執行實現的基類使用派生類必須重載的虛函數,就不能使用遏制。

+1

我曾經使用過一個受保護的虛擬基礎來管理鏈接器各種傳遞的命令行參數;每個傳遞都由它自己的類型處理,並且鏈接器類型是從每個傳遞類型私有派生的。事後看來,我不確定這是一個好設計還是隻是炫耀。 –

相關問題