- 所謂繼承就是從先輩處得到屬性和行爲特徵。專業的說就是在已有類的基礎上創建新的類,新類可以從一個或多個已有類中繼承成員函數和數據成員,而且重新定義或加進新的數據和函數,從而引成類的層次或等級。其中,已有類稱爲基類或父類,在他基礎上建立的類稱爲派生類或子類。
上圖是簡單的學生分類圖
下面通過一個例子說明爲什麼要使用繼承。
現在有一個學生類 Student, 它含有 number, name, score 等數據成員與成員函數 print( ), 代碼如下:
class Student
{
public:
void print()
{
cout<<"number:"<<number<<endl;
cout<<"name:"<<name<<endl;
cout<<"score:"<<score<<endl;
}
protected:
int number;
string name;
float score;
};
假設現在要申明一個大學生類 UStudent,它含有 number, name, score, major 等數據和成員函數 print1(),代碼如下:
class UStudent
{
public:
void print1()
{
cout<<"number:"<<number<<endl;//此行在Student類中已存在
cout<<"name:"<<name<<endl;//此行在Student類中已存在
cout<<"score:"<<score<<endl;//此行在Student類中已存在
cout<<"major:"<<major<<endl;//此行在Student類中 不 存在
}
protected:
int number;//此行在Student類中已存在
string name;//此行在Student類中已存在
float score;//此行在Student類中已存在
string major;//此行在Student類中 不 存在
};
我們發現Student類和UsStudent類中有有許多相同的地方,像這樣兩個類,代碼嚴重重複, 爲提高代碼的可重用性,可以引入繼承,將UStudent類說明成Student類的派生類,那些相同的成員就不必在UsStudent類中說明了。代碼如下:
class Student
{
public:
void print()
{
cout<<"number:"<<number<<endl;
cout<<"name:"<<name<<endl;
cout<<"score:"<<score<<endl;
}
protected:
int number;
string name;
float score;
};
class UStudent:public Student
{
public:
void print1()//新的成員函數
{
print();
cout<<"major:"<<major<<endl;
}
protected:
string major;//新增加的數據成員
};
2.基類成員在派生類中的訪問屬性:
3. 1派生類的構造函數和析構函數
3.1.1派生類構造函數和析構函數的調用規則
通常情況下,當創建派生類對象時,首先調用積累的構造函數,隨後再調用派生類的構造函數,當撤銷派生類對象時,則先調用派生類的析構函數,隨後再調用基類的構造函數。
3.2派生類構造函數和析構函數的構造規則
3.2.1簡單的派生類的構造函數和析構函數
當基類的構造函數沒有參數,或沒有顯示定義構造函數時,派生類可以不向基類傳遞,甚至可以不定義構造函數。派生類不能繼承基類中的構造函數和析構函數。當基類含有帶參數的構造函數時,派生類必須定義構造函數,以提供把參數傳遞給基類構造函數的途徑。代碼解析:
#include<iostream>
#include<stdlib.h>
using namespace std;
class B //申明基類B
{
public:
B(int n) //基類的構造函數
{
cout<<"Constructing B class"<<endl;
i = n;
}
~B() //基類的析構函數
{
cout<<"Destructing B class"<<endl;
}
void dispi()
{
cout<<i<<endl;
}
private:
int i;
};
class D:public B //申明基類B的公有派生類D
{
public:
D(int n, int m) //定義派生類構造函數時,
:B(m) //綴上要調用的基類構造函數及其參數
{
cout<<"Constructing D class"<<endl;
j = n;
}
~D() //派生類的析構函數
{
cout<<"Destructing D class"<<endl;
}
void dispj()
{
cout<<j<<endl;
}
private:
int j;
};
void Funtest()
{
D obj(50,60);
obj.dispi();
obj.dispj();
}
int main()
{
Funtest();
system("pause");
return 0;
}
結果如下:
未寫完