1. 程式人生 > >繼承的意義(三十六)

繼承的意義(三十六)

C++ 繼承 組合關系 代碼復用

今天我們來講下 C++ 三大特性之繼承。我們首先來思考下,類與類之間是否存在直接的關聯關系呢?我們還是以之前的講解的電腦為例,說下組合關系,組合便是整體與部分的關系,如下

技術分享圖片

我們以這個關系為例,用代碼來描述下

#include <iostream>
#include <string>

using namespace std;

class Memory
{
public:
    Memory()
    {
        cout << "Memory()" << endl;
    }
    ~Memory()
    {
        cout << "~Memory()" << endl;
    }
};

class Disk
{
public:
    Disk()
    {
        cout << "Disk()" << endl;
    }
    ~Disk()
    {
        cout << "~Disk()" << endl;
    }
};

class CPU
{
public:
    CPU()
    {
        cout << "CPU()" << endl;
    }
    ~CPU()
    {
        cout << "~CPU()" << endl;
    }
};

class MainBoard
{
public:
    MainBoard()
    {
        cout << "MainBoard()" << endl;
    }
    ~MainBoard()
    {
        cout << "~MainBoard()" << endl;
    }
};

class Computer
{
    Memory mMem;
    Disk mDisk;
    CPU mCPU;
    MainBoard mMainBoard;
public:
    Computer()
    {
        cout << "Computer()" << endl;
    }
    void power()
    {
        cout << "power()" << endl;
    }
    void reset()
    {
        cout << "reset()" << endl;
    }
    ~Computer()
    {
        cout << "~Computer()" << endl;
    }
};

int main()
{
    Computer c;
    
    return 0;
}

我們看到電腦是由硬盤、內存、CPU和主板構成的,我們看看編譯結果

技術分享圖片

確實在生成電腦這個對象時,先是生成了硬盤、內存、CPU和主板一系列的東西,在析構的時候順便將這些東西也都清理了。那麽我們來看看組合關系的特點a> 將其它類的對象作為當前類的成員使用;b> 當前類的對象與成員對象的聲命周期相同;c> 成員對象在用法上與普通對象完全一致

那麽繼承又是怎樣的關系呢?繼承關系通俗來講就是父子關系,如下

技術分享圖片

面向對象中的繼承便是指類之間的父子關系,子類擁有父類的所有屬性和行為, 子類就是這一種特殊的父類。子類對象可以當做父類對象使用,子類中可以添加父類中沒有的方法和屬性

。C++ 中通過下面的方式描述繼承關系

技術分享圖片

下來我們通過示例代碼來看看繼承

#include <iostream>
#include <string>

using namespace std;

class Parent
{
    int mi;
public:
    Parent()
    {
        cout << "Parent()" << endl;
        mi = 100;
    }
    void method()
    {
        cout << "mi = " << mi << endl;
    }
};

class Child : public Parent
{
public:
    void hello()
    {
        cout << "I'm Child calss!" << endl;
    }
};

int main()
{
    Child d;
    Child d1;
    
    Parent p = d1;

    d.hello();
    d.method();

    return 0;
}

我們直接用類 Child 生成的對象 d 去調用類 Parent 的成員函數 method,而且在第 35 行直接用對象 d1 去初始化對象 p。我們看看編譯是否會通過

技術分享圖片

我們看到沒有報錯,並且運行成功。我們之前說過子類擁有父類的一切屬性,子類對象可以當做特殊的父類對象,所以這就不難解釋了。子類對象便可以直接使用父類中的所有資源,這便有點類似於我們在 C 語言中說的代碼復用了(其實繼承的本質就是復用父類的代碼)。那麽繼承有幾條規則:a> 子類便是一個特殊的父類;b> 子類對象是可以直接初始化父類對象的;c> 子類對象可以直接賦值給父類對象。

那麽繼承的意義是什麽呢?繼承是 C++ 中代碼復用的重要手段。通過繼承,可以獲得父類的所有功能,並且可以在子類中重寫已有的功能,或者添加新功能

下來我們再通過一個示例代碼來加深下對繼承的理解

#include <iostream>
#include <string>

using namespace std;

class Memory
{
public:
    Memory()
    {
        cout << "Memory()" << endl;
    }
    ~Memory()
    {
        cout << "~Memory()" << endl;
    }
};

class Disk
{
public:
    Disk()
    {
        cout << "Disk()" << endl;
    }
    ~Disk()
    {
        cout << "~Disk()" << endl;
    }
};

class CPU
{
public:
    CPU()
    {
        cout << "CPU()" << endl;
    }
    ~CPU()
    {
        cout << "~CPU()" << endl;
    }
};

class MainBoard
{
public:
    MainBoard()
    {
        cout << "MainBoard()" << endl;
    }
    ~MainBoard()
    {
        cout << "~MainBoard()" << endl;
    }
};

class Computer
{
    Memory mMem;
    Disk mDisk;
    CPU mCPU;
    MainBoard mMainBoard;
public:
    Computer()
    {
        cout << "Computer()" << endl;
    }
    void power()
    {
        cout << "power()" << endl;
    }
    void reset()
    {
        cout << "reset()" << endl;
    }
    ~Computer()
    {
        cout << "~Computer()" << endl;
    }
};

class HPBook : public Computer
{
    string mOS;
public:
    HPBook()
    {
        mOS = "Windows 10";
    }
    void install(string os)
    {
        mOS = os;
    }
    void OS()
    {
        cout << mOS << endl;
    }
};

class MacBook : public Computer
{
public:
    void OS()
    {
        cout << "Mac OS" << endl;
    }
};

int main()
{
    HPBook hp;
    
    hp.power();
    hp.install("Ubuntu 16.04");
    hp.OS();
    
    cout << endl;
    
    MacBook mac;
    
    mac.OS();
    
    return 0;
}

我們在電腦的基礎上新定義了 hp 和 Mac 兩種電腦。給 hp 重裝了 Ubuntu 系統,然後打印了它的系統。直接打印 Mac 電腦的系統,看看是否如我們所願

技術分享圖片

確實是這樣的。通過對繼承的學習,總結如下:1、繼承是面向對象中類之間的一種關系;2、子類擁有父類的所有屬性和行為;3、子類對象可以當做父類對象使用;4、子類中可以添加父類中沒有的方法和屬性;5、繼承是面向對象中代碼復用的重要手段


歡迎大家一起來學習 C++ 語言,可以加我QQ:243343083

繼承的意義(三十六)