繼承:繼承是指一個對象直接使用另一對象的屬性和方法。(繼承是一種複用手段,共享公有的東西,實現各自不同的東西)
類的繼承:新類(派生類/子類)從已有類(基類/父類)得到已有的特性。
理解:派生類不僅具有基類的屬性,還有自己特有的屬性。
繼承方式和成員訪問限定符
從基類繼承來的成員在派生類的訪問屬性是由繼承方式控制的。
類的繼承方式: public(公有繼承) protected(保護繼承) private(私有繼承)
公有繼承時,基類的非私有成員在子類的訪問屬性都不變。
保護繼承時,基類的非私有成員在子類的保護成員。
私有繼承時,基類的非私有成員在子類的私有成員。
成員訪問限定符也有三: public(公有) protected(保護) private(私有)
public: 訪問不受限制
protected:訪問範圍限定於它所屬的類或該類的派生類。
private:訪問範圍限定於它所屬的類。
class Person//基類
{
public :
void Display ()
{
cout<<_name <<endl;
}
protected :
string _name ; // 姓名
int age;
};
class Student : <span style="background-color: rgb(255, 204, 204);">public</span> Person //學生類繼承了父類的_name和age,就不需要再次定義
{
protected :
int _num1 ; // 學號 是學生類特有的屬性
};
class Teacher:public Person
{
protected:
int _num2; //工號 是教師類特有的屬性
賦值兼容規則
1. 子類對象可以賦值給父類對象
2. 父類對象不能賦值給子類對象
3. 父類的指針/引用可以指向子類對象
4. 子類的指針/引用不能指向父類對
理解:子類有父類的屬性,但父類不一定有子類的屬性。學生一定是人,但人不一定是學生。
如果在子類定義了一個成員變量與父類相同(子類成員覆蓋了父類成員/重定義),則子類將訪問子類中的成員。如果我想要訪問父類的成員,則 “ 基類::基類成員 ” 訪問。
單繼承和多繼承
菱形繼承
class Person {
public :
string _name ; <span style="font-family: arial, sans-serif;"> // 姓名</span>
<span style="font-family: arial, sans-serif;"> };</span>
class Student : public Person
{
protected :
int _num ; //學號
};
class Teacher : public Person
{ protected :
int _id ; // 工號 };
class Assistant : public Student, public Teacher
{
protected :
string _majorCourse ; // 主修課程
};