C ++中的public
, private
繼承和protected
繼承有什麼區別? 我在SO上發現的全部問題都與特定狀況有關。 安全
若是您從另外一個類公開繼承,那麼每一個人都知道您正在繼承,而且任何人均可以經過基類指針來使用您。 函數
若是您保護性地繼承您的子類,則能夠多態使用您。 優化
若是您私下繼承,則只有您本身才能執行父類方法。 this
這基本上象徵着其他班級對您與父母班級關係的瞭解 spa
class A { public: int x; protected: int y; private: int z; }; class B : public A { // x is public // y is protected // z is not accessible from B }; class C : protected A { // x is protected // y is protected // z is not accessible from C }; class D : private A // 'private' is default for classes { // x is private // y is private // z is not accessible from D };
重要說明:類B,C和D都包含變量x,y和z。 這只是訪問的問題。 指針
關於受保護和私有繼承的用法,您能夠在這裏閱讀。 code
公共繼承爲IS-A關係建模。 用 繼承
class B {}; class D : public B {};
每一個D
是一個 B
ip
私有繼承爲IS-IMPLEMENTED-USING關係(或任何所謂的關係)建模。 用 內存
class B {}; class D : private B {};
D
不是 B
,可是每一個D
在實現中都使用B
始終能夠經過使用遏制來消除私有繼承:
class B {}; class D { private: B b_; };
該D
也可使用B
來實現,在這種狀況下,可使用其b_
。 與繼承相比,包含是類型之間的緊密耦合,所以一般應首選。 有時使用包容代替私有繼承不如私有繼承方便。 一般這是懶惰的la腳藉口。
我認爲沒有人知道什麼protected
繼承模型。 至少我尚未看到任何使人信服的解釋。
限制繼承的可見性將使代碼沒法看到某個類繼承了另外一個類:從派生到基礎的隱式轉換將不起做用,從基類到派生的static_cast
也將不起做用。
只有類的成員/朋友能夠看到私有繼承,只有成員/朋友和派生類能夠看到受保護的繼承。
公共繼承
IS-A繼承。 按鈕是一個窗口,在須要窗口的任何地方,也能夠傳遞按鈕。
class button : public window { };
受保護的繼承
受保護的術語實施。 不多有用。 在boost::compressed_pair
使用,以從空類派生並使用空基類優化節省內存(下面的示例不使用模板保持原狀):
struct empty_pair_impl : protected empty_class_1 { non_empty_class_2 second; }; struct pair : private empty_pair_impl { non_empty_class_2 &second() { return this->second; } empty_class_1 &first() { return *this; // notice we return *this! } };
私人繼承
以術語實施。 基類的用法僅用於實現派生類。 對於特徵和大小重要的狀況頗有用(僅包含函數的空特徵將利用空的基類優化)。 不過,一般圍堵是更好的解決方案。 字符串的大小很關鍵,所以在這裏很常見
template<typename StorageModel> struct string : private StorageModel { public: void realloc() { // uses inherited function StorageModel::realloc(); } };
公衆成員
骨料
class pair { public: First first; Second second; };
存取器
class window { public: int getWidth() const; };
受保護的成員
爲派生類提供加強的訪問權限
class stack { protected: vector<element> c; }; class window { protected: void registerClass(window_descriptor w); };
私人會員
保留實施細節
class window { private: int width; };
請注意,C樣式強制轉換容許以定義的安全方式將派生類強制轉換爲受保護的基類或私有基類,而且也能夠強制轉換爲另外一個方向。 應不惜一切代價避免這種狀況,由於它可使代碼依賴於實現細節-可是,若有必要,您可使用此技術。
基類的私有成員只能由該基類的成員訪問。
該基類的成員,其派生類的成員以及在該基類和派生類以外的成員均可以訪問該基類的公共成員。
基類的成員及其派生類的成員均可以訪問基類的受保護成員。
私人的 :基地
保護 :基本+派生
公開 :基礎+派生+任何其餘成員