標籤:hang inter png tps 之一 核心 最好 oid pre
轉載自https://www.cnblogs.com/33debug/p/6666939.html1、繼承與派生
繼承是使代碼可以複用的重要手段,也是物件導向程式設計的核心思想之一。簡單的說,繼承是指一個對象直接使用另一對象的屬性和方法。繼承呈現了 物件導向程式設 計的階層, 體現了 由簡單到複雜的認知過程。C++中的繼承關係就好比現實生活中的父子關係,繼承一筆財產比白手起家要容易得多,原始類稱為基類,繼承類稱為衍生類別,它們是類似於父親和兒子的關係,所以也分別叫父類和子類。而子類又可以當成父類,被另外的類繼承。繼承的方式有三種分別為公有繼承(public),保護繼承(protect),私人繼承(private)。
定義格式如下:
2、繼承方式及訪問屬性
(1) 公有繼承(public)
公有繼承的特點是基類的公有成員和保護成員作為衍生類別的成員時,它們都保持原有的狀態,而基類的私人成員仍然是私人的,不能被這個衍生類別的子類所訪問。
(2)私人繼承(private)
私人繼承的特點是基類的公有成員和保護成員都作為衍生類別的私人成員,並且不能被這個衍生類別的子類所訪問。
(3)保護繼承(protected)
保護繼承的特點是基類的所有公有成員和保護成員都成為衍生類別的保護成員,並且只能被它的衍生類別成員函數或友元訪問,基類的私人成員仍然是私人的。
private能夠對外部和子類保密,即除了成員所在的類本身可以訪問之外,別的都不能直接存取。protected能夠對外部保密,但允許子類直接存取這些成員。public、private和protected對成員資料或成員函數的保護程度可以用下表來描述:舉個栗子:
1 class Base //父類 2 { 3 private: 4 int _priB; 5 protected: 6 int _proB; 7 public: 8 int _pubB; 9 } ;10 class Derived: public Base //子類,繼承自base,繼承類型為公有繼承11 {12 private:13 int _d_pri;14 protected:15 int _d_pro;16 public:17 void funct()18 {19 int d;20 d=_priB; //error:基類中私人成員在衍生類別中是不可見的21 d=_proB; //ok: 基類的保護成員在衍生類別中為保護成員22 d=_pubB; //ok: 基類的公用成員在衍生類別中為公用成員23 }24 int _d_pub;25 } ;
總結:(1). public繼承是一個介面繼承,保持is-a原則,每個父類可用的成員對子類也可用, 因為每個子類對象也都是一個父類對象。
26 class C :private Base //基類Base的衍生類別C(私人繼承)27 {28 public:29 void funct()30 {31 int c;32 c=_priB; //error:基類中私人成員在衍生類別中是不可見的33 c=_proB; //ok:基類的保護成員在衍生類別中為私人成員34 c=_pubB; //ok:基類的公用成員在衍生類別中為私人成員35 }36 };37 class E :protected Base //基類Base的衍生類別E(保護繼承)38 {39 public:40 void funct()41 {42 int e ;43 e=_priB; //error:基類中私人成員在衍生類別中是不可見的44 e=_proB; //ok:基類的保護成員在衍生類別中為保護成員45 e=_pubB; //ok:基類的公用成員在衍生類別中為保護成員46 }47 };
總結:
(2). 基類的private成員 在衍生類別中是不能被訪問的, 如果基類成員 不想在類外直接被訪問, 但需要 在衍生類別中能訪問, 就定義為protected。 可以看出保護成員 限定符是因繼承才出現的。
(3). protected/private繼承是一個實現繼承, 基類的部分成員 並非完全成為子類介面 的一部分, 是 has-a 的關係原則, 所以非特殊情況下不會使用這兩種繼承關係, 在絕大多數的情境下使用的 都是公有繼承。 私人繼承以為這is-implemented-in-terms-of(是根據……實現的) 。 通常比組合(composition) 更低級, 但當一個衍生類別需要訪問 基類保護成員 或需要重定義基類的虛函數時它就是合理的。
49 int main()50 {51 int a; 53 D d;54 a=D._priB; //error:公有繼承基類中私人成員在衍生類別中是不可見的,對對象不可見55 a=D._proB; //error:公有繼承基類的保護成員在衍生類別中為保護成員,對對象不可見56 a=D._pubB; //ok:公有繼承基類的公用成員在衍生類別中為公用成員,對對象可見58 C c;59 a=c._priB; //error:私人繼承基類中私人成員在衍生類別中是不可見的, 對對象不可見60 a=c._proB; //error:私人繼承基類的保護成員在衍生類別中為私人成員,對對象不可見61 a=c._pubB; //error:私人繼承基類的公用成員在衍生類別中為私人成員,對對象不可見63 E e;64 a=e._priB; //error:保護繼承基類中私人成員在衍生類別中是不可見的, 對對象不可見65 a=e._proB; //error:保護繼承基類的保護成員在衍生類別中為保護成員,對對象不可見66 a=e._pubB; //error:保護繼承基類的公用成員在衍生類別中為保護成員,對對象不可見67 68 return 0;69 }
(4). 不管是哪種繼承方式, 在衍生類別內部都可以訪問基類的公有成員和保護成員 , 基類的私人成員存在但是在子類中不可見( 不能訪問) 。
(5). 使用關鍵字class時預設的繼承方式是private, 使用struct時預設的繼承方式是public, 不過最好顯式的寫出繼承方式。
(6). 在實際運用中一般使用都是public繼承, 極少情境下才會使用protetced/private繼承。
在struct繼承中,如果沒有顯式給出繼承類型,則預設的為public繼承;在class繼承中,如果沒有顯式給出繼承類型,則預設的為private繼承;
繼承關係&訪問限定符
C++學習二繼承