C++繼承和派生(初學)
繼續學習C++,學習到繼承和派生
定義:
類的繼承,是新的類從已有類那裡得到已有的特性。或從已有類產生新類的過程就是類的派生。原有的類稱為基類或父類,產生的新類稱為派生類或子類。
派生與繼承,是同一種意義兩種稱謂。(繼承相當於“子承父業”,而派生相當於“父親派生出了一個兒子”,兩者的角度不同,本質一樣)
下例就是一個繼承:
//C++通過繼承關係,實現了程式碼的可重用性
class Human //父類:體現的是共性 { public: void eat(string food) { cout<<"i am eating "<<food<<endl; } }; class Student : public Human //子類:是在父類的基礎上增加新的功能,體現的是個性 { public: void study(string course) { cout<<"i am learning "<<course<<endl; } };
對於is-a
is-a是一種屬於關係,如:狗屬於一種動物,車屬於一種交通工具(Dog is an Animal. Car is a Vehicle.)在面向物件中表現為一種繼承關係。可以設計一個Animal類,Dog類作為 Animal類(基類)的派生類;設計一個Vehicle類,Car類作為Vehicle類(基類)的派生類。
has-a是一種包含、組合關係。如:車包含方向盤、輪胎、發動機(Car has steering-wheel,wheels,engine),但不能說方向盤/輪胎/發動機是一種車;正確的應該說車聚合(包含)了方向盤、輪胎、發動機。
因此,如果A是(is a)B,則B是A的基類,A是B的派生類。為繼承關係。
如果A包含B,則B是A的組成部分。為聚合關係,可以由組成部分聚合成為一個類。
語法
class 派生類名:[繼承方式] 基類名 //[繼承方式]這裡有括號,說明是可以省略的,若寫成 class 派生類名:[] 基類名
{ //則表示 class 派生類名:[private] 基類名
派生類成員宣告;
}; //注意分號
重新看下面例子
class Human { public: void eat(string food) { cout<<"i am eating "<<food<<endl; } }; class Student : public Human //這裡的public表示的是繼承方式 若把public省略就是預設private { public: //這裡的public表示的是訪問許可權 void study(string course) { cout<<"i am learning "<<course<<endl; } };
繼承方式
繼承方式規定了如何訪問基類繼承的成員。繼承方式有public,private,protected。繼承方式不影響派生類的訪問許可權,影響了從基類繼承來的成員的訪問許可權,包括派生類內的訪問許可權和派生類物件。
分為三大類:
公有繼承:基類的公有成員和保護成員在派生類中保持原有訪問屬性,其私有成員仍為基類的私有成員。
私有繼承:基類的公有成員和保護成員在派生類中成了私有成員,其私有成員仍為基類的私有成員。
保護繼承:基類的公有成員和保護成員在派生類中成了保護成員,其私有成員仍為基類的私有成員。
保護繼承(protected)對於外界訪問屬性來說,等同於私有,但可以派生類中可見。