標籤:
1、概念
繼承:在定義一個新的類B時,如果該類與某個已知類A相似(指的是B擁有A的全部特點),那麼就可以把A作為一個基類,而把B作為一個衍生類別(也稱子類)。
- 衍生類別是通過對基類進行修改和擴充得到的。在衍生類別中,可以擴充新的成員變數和成員函數。
- 衍生類別一經定義後,可以獨立使用,不依賴於基類。
- 衍生類別擁有基類的全部成員函數和成員變數,不論是private,protected 還是 public
- 在衍生類別的各個成員函數中,不能訪問基類中的private成員。
2、需要繼承機制的例子 - 學生管理系統
所有的學生都有的共同屬性:
所有的學生都有的共同方法(成員函數)
而不同的學生,又有各自不同的屬性和方法
- 研究生:有導師和系
- 大學生:有系
- 中學生:有競賽特長加分
3、衍生類別的寫法
class 衍生類別名 : public 基類名 {};
4、衍生類別對象的記憶體空間
衍生類別對象的體積,等於基類對象的體積,再加上衍生類別對象自己的成員變數的體積。
在衍生類別對象中,包含著基類對象,而且基類對象的儲存位置位於衍生類別對象新增的成員
變數之前。如下代碼示:
#include <iostream>#include <string.h>using namespace std;class CBase { int v1, v2;};class CDerived : public CBase { int v3;};int main(){ printf("sizeof(CDerived) = %d\n", sizeof(CDerived)); return 0;}
輸出的結果是:12
5、繼承執行個體程式:學籍管理
#include <iostream>#include <string.h>using namespace std;class CStudent {private: string name; string id; // student number char gender; // ‘F‘ for female, ‘M‘ for male int age;public: void PrintInfo() { cout << "name: " << name << endl; cout << "id: " << id << endl; cout << "gender: " << gender << endl; cout << "age: " << age << endl; } void SetInfo(const string & name_, const string & id_, int age_, char gender_) { name = name_; id = id_; age = age_; gender = gender_; } string GetName() { return name; }};class CUndergraduateStudnet : public CStudent{private: string department; // 學生所屬的系public: void QualifiedForBaoyan() { cout << "qualified for baoyan" << endl; } void 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_; }};int main(){ CUndergraduateStudnet s2; s2.SetInfo("Harry Potter", "115200", 20, ‘M‘, "CS"); cout<< s2.GetName() << endl; s2.QualifiedForBaoyan(); s2.PrintInfo(); return 0;}
執行結果如下:
C++ 繼承和派生 及 學生管理範例