條款39 明智的使用private繼承

2022-01-22 07:05:43 字數 604 閱讀 3303

首先看一下private繼承的法則:

class之間的繼承關係如果是private的話,那麼編譯器不會將乙個derived物件自動當作為乙個base class物件。

從base class繼承而來的所有方法以及屬性,在derived class都會變成是private的。

private繼承的底層含義實際上是;implemented in terms of,通過private繼承的主要目的是使得derived class使用base 已經做好的某些東西,但是外部仍然是無法歲base class的部分進行訪問的。(實現繼承,省略介面部分)

雖然說private繼承以及組合都可以實現implemented in terms of的關係,但能使用組合還是應該盡量使用組合。

小結:當面對  不存在is-a關係的兩個class的時候,其中乙個需要訪問另乙個的protected成員,或者需要重新定義其一或者多個virtual函式的時候,private才有可能成為適合的選擇。

在考慮完public 組合繼承的方式之後,才應該考慮private繼承

與符合不同的是,private繼承可以造成empty base的最優化,這對於某些希望減小物件尺寸的庫作者來說還是很有用的(例如stl就是這樣。)

條款39 明智而審慎的使用private繼承

use private inheritance judiciously.如果classes之間的繼承關係是private,編譯器不會自動將乙個derived class物件轉換為乙個base class物件。這和public繼承的情況不同。由private base class繼承而來的所有成員,在...

條款42 明智地使用私有繼承

條款35說明,c 將公有繼承視為 是乙個 的關係。它是通過這個例子來證實的 假如某個類層次結構中,student類從person類公有繼承,為了使某個函式成功呼叫,編譯器可以在必要時隱式地將student轉換為person。這個例子很值得再看一遍,只是現在,公有繼承換成了私有繼承 class per...

條款42 明智地使用私有繼承

第乙個規則是,和公有繼承相反,如果兩個類之間的繼承關係為私有,編譯器一般不會將派生類物件 如student 轉換成基類物件 如person 第二個規則是,從私有基類繼承而來的成員都成為了派生類的私有成員,即使它們在基類中是保護或公有成員,即派生類物件不能訪問基類的所有成員 class person ...