第五週 繼承
1.繼承和派生的基本概念
2.繼承關係和複合關係
3.覆蓋和保護成員
4.派生類的構造函數
5.公有(public)繼承的賦值兼容原則
1.繼承和派生的基本概念
繼承:在定義一個新的類B時,如果該類與某個已有的類A相似(指的是B擁有A的全部特點),那麼就可以把A作爲一個 基類,而把B作爲基類的一個 派生類( 也稱子類) 。
派生類是通過對基類進行修改和擴充得到的。在派生類中,可以擴充新的成員變量和成員函數。
派生類一經定義後,可以獨立使用,不依賴於基類。
派生類擁有基類的全部成員函數和成員變量,不論是private、protected、public 。
派生類的各個成員函數中,不能訪問基類中的private成員。
一個派生類對象也是基類對象。
需要繼承機制的例子
所有的學生都有的共同屬性:
姓名,學號,性別,成績
所有的學生都有的共同方法(成員函數):
是否該留級,是否該獎勵
而不同的學生,又有各自不同的屬性和方法
研究生:導師,系
大學生:系
中學生:競賽特長加分
如果爲每類學生都從頭編寫一個類,顯然會有不少重複的代碼,浪費。
派生類的寫法
class 派生類名:public 基類名
{
};
class CStudent {
private:
string sName;
int nAge;
public:
bool IsThreeGood() { };
void SetName( const string & name )
{ sName = name; }
//......
};
class CUndergraduateStudent: public CStudent {
private:
int nDepartment;
public:
bool IsThreeGood() { ...... }; //覆蓋,對基類進行修改
bool CanBaoYan() { .... };
}; // 派生類的寫法是:類名: public 基類名
class CGraduatedStudent:public CStudent {
private:
int nDepartment;
char szMentorName[20];
public:
int CountSalary() { ... };
};
派生類對象的內存空間
派生類對象的體積,等於基類對象的體積,再加上派
生類對象自己的成員變量的體積。在派生類對象中,包
含着基類對象,而且基類對象的存儲位置位於派生類對
象新增的成員變量之前。
class CBase
{
int v1,v2;
};
class CDerived:public CBase
{
int v3;
};
例子,繼承實例程序:學籍管理
#include <iostream>
#include <string>
using namespace std;
class CStudent {
private:
string name;
string id; //學號
char gender; //性別,'F'代表女,'M'代表男
int age;
public:
void PrintInfo();
void SetInfo( const string & name_,const string & id_,int age_, char gender_ );
string GetName() { return name; }
};
class CUndergraduateStudent:public CStudent
{
//本科生類,繼承了CStudent類
private:
string department; //學生所屬的系的名稱
public:
void QualifiedForBaoyan() { //給予保研資格
cout << “qualified for baoyan” << endl;
}
void PrintInfo() {//覆蓋了基類的PrintInfo()
CStudent::PrintInfo(); //調用基類的PrintInfo
cout << “Department:” << department <<endl;
}
void SetInfo( const string & name_,const string & id_,int age_,char gender_ ,const string & department_) {
CStudent::SetInfo(name_,id_,age_,gender_); //調用基類的SetInfo
department = department_;
}
};
void CStudent::PrintInfo()
{
cout << "Name:" << name << endl;
cout << "ID:" << id << endl;
cout << "Age:" << age << endl;
cout << "Gender:" << gender << endl;
}
void CStudent::SetInfo( const string & name_,const string & id_,int age_,char gender_ )
{
name = name_;
id = id_;
age = age_;
gender = gender_;
}
void CStudent::PrintInfo()
{
cout << "Name:" << name << endl;
cout << "ID:" << id << endl;
cout << "Age:" << age << endl;
cout << "Gender:" << gender << endl;
}
void CStudent::SetInfo( const string & name_,const string & id_,int age_,char gender_ )
{
name = name_;
id = id_;
age = age_;
gender = gender_;
}
int main()
{
CUndergraduateStudent s2;
s2.SetInfo(“Harry Potter ”, “118829212”,19,‘M’,“Computer Science”);
cout << s2.GetName() << “ ” ;
s2.QualifiedForBaoyan ();
s2.PrintInfo ();
return 0;
}
輸出結果:
Harry Potter qualified for baoyan
Name:Harry Potter
ID:118829212
Age:19
Gender:M
Department:Computer Science