繼承與派生

  1. 所謂繼承就是從先輩處得到屬性和行爲特徵。專業的說就是在已有類的基礎上創建新的類,新類可以從一個或多個已有類中繼承成員函數和數據成員,而且重新定義或加進新的數據和函數,從而引成類的層次或等級。其中,已有類稱爲基類或父類,在他基礎上建立的類稱爲派生類或子類。這裏寫圖片描述
    上圖是簡單的學生分類圖
    下面通過一個例子說明爲什麼要使用繼承。
    現在有一個學生類 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;
}

結果如下:
這裏寫圖片描述
未寫完

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章