1. 程式人生 > >【C++深度剖析教程22】繼承的概念和意義

【C++深度剖析教程22】繼承的概念和意義

今天我們來學習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; }

執行結果為:
Memory()
Disk()
CPU()
MainBoard()
Computer()
~Computer()
~MainBoard()
~CPU()
~Disk()
~Memory()

從上面程式我們可以看出組合關係的特點是:

  • 將其他類的物件作為當前類的成員使用
  • 當前類的物件與成員物件的生命週期相同
  • 成員物件與普通物件在語法上完全相同

二、類之間的繼承關係

還是先看一個生活中的例項:
這裡寫圖片描述

那麼繼承關係有什麼樣的性質呢?

面向物件的繼承就是指類之間的父子關係

  • 子類擁有父類的所有屬性和行為
  • 子類就是一種特殊的父類
  • 子類物件可以當做父類物件使用
  • 子類中可以新增父類沒有的屬性和方法

C++中通過下面的方式描述繼承的關係
這裡寫圖片描述

下面還是來用一個例子程式來分析繼承的關係吧:

#include <iostream>
#include <string>

using namespace std;

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

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

int main()
{   
    Child c;

    c.hello();
    c.method();

    return 0;
}

執行結果為:
Parent()
I’m Child calss!
mv = 100
由執行結果可以看出,當執行Child c建立類c時,就直接呼叫了父類的建構函式進行列印語句。然後執行 c.hello();c.method();這兩個語句時,分別呼叫孩子類的成員函式與父親類的成員函式,這說明孩子物件可以直接呼叫父親的成員函式和本身自己的成員函式。

繼承的重要規則:

  • 子類就是一個特殊的父類
  • 子類物件可以直接初始化父類物件
  • 子類物件可以直接賦值給父類物件

繼承的意義:
繼承是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 8";
    }
    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 LTS");
    hp.OS();

    cout << endl;

    MacBook mac;

    mac.OS();

    return 0;
}

執行結果為:
Memory()
Disk()
CPU()
MainBoard()
Computer()
power()
Ubuntu 16.04 LTS

Memory()
Disk()
CPU()
MainBoard()
Computer()
Mac OS
~Computer()
~MainBoard()
~CPU()
~Disk()
~Memory()
~Computer()
~MainBoard()
~CPU()
~Disk()
~Memory()

我們可以看出,程式的前幾個類是組合關係,後面的兩個類HPBook與MacBook類與Computer類是繼承的關係。其中HPBook與MacBook類繼承了Computer類的所有行為。

由以上幾個程式的分析可以得出以下幾條總結:

  1. 繼承是面向物件中類之間的一種關係
  2. 子類擁有父類所有的屬性和行為
  3. 子類物件可以當做父類的物件使用
  4. 子類中可以新增父類中所沒有的方法和屬性
  5. 繼承是面向物件中程式碼複用的重要手段

想一起探討以及獲得各種學習資源加我(有我部落格中寫的程式碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關於嵌入式,作業系統,C++語言,C語言,資料結構等技術問題。