26、不一樣的C++系列--繼承的基礎知識

繼承

繼承的概念

類之間的兩大關係:組合和繼承:

  • 組合關係的特點:
    • 將其它類的對象作爲自己的成員使用
    • 當前類的對象與成員對象的聲明期相同
    • 成員對象在用法上與普通對象完全一致

組合關係的代碼示例:

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

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

class Computer
{
    Memory mMem;
    Disk mDisk;
public:
    Computer()
    {
        cout << "Computer()" << endl;
    }
    ~Computer()
    {
        cout << "~Computer()" << endl;
    }
};
  • 繼承(父子關係):

    • 子類擁有父類的所有屬性和行爲
    • 子類就是一種特殊的父類
    • 子類對象可以當做父類對象使用
    • 子類中可以添加父類沒有的方法和屬性
  • C++中通過下面的方式描述繼承關係

class Parent
{
    int mv;
public:
    void method() {};
};

class Child: public Parent  // 描述繼承關係
{
};
  • 重要規則:
    • 子類就是一個特殊的父類
    • 子類對象可以直接初始化父類對象
    • 子類對象可以直接賦值給父類對象

繼承關係代碼示例:

#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;
}

繼承的訪問級別

  • 根據面向對象理論:

    • 子類擁有父類的一切屬性和行爲
    • 子類能夠直接訪問父類的私有成員
  • 根據C++語法:

    • 外界不能直接訪問類的private成員
    • 子類不能直接訪問父類的私有成員

舉一個例子:

class Parent
{
private:
    int mv;
public:
    Parent()
    {
        mv = 100;
    }

    int value()
    {
        return mv;
    }
};

class Child : public Parent
{
public:
    int addValue(int v)
    {
        //子類直接訪問父類的私有成員變量
        mv = mv + v;    
    }
};

int main()
{   
    return 0;
}

運行結果如下:

nethanhandeMacBook-Pro-2:代碼 nethanhan$ g++ 44-1.cpp 
44-1.cpp:27:9: error: 'mv' is a private member of 'Parent'
        mv = mv + v;    // ???? <C8><E7><BA>η<C3><CE>ʸ<B8><C0><E0><B5>ķǹ...
        ^
44-1.cpp:9:9: note: declared private here
    int mv;
        ^
44-1.cpp:27:14: error: 'mv' is a private member of 'Parent'
        mv = mv + v;    // ???? <C8><E7><BA>η<C3><CE>ʸ<B8><C0><E0><B5>ķǹ...
             ^
44-1.cpp:9:9: note: declared private here
    int mv;
        ^
2 errors generated.

結果裏說到 mv 是一個私有成員變量,在子類中不能直接私有成員。所以需要使用另外一個關鍵字 protested

  • 關鍵字 protected 的意義:
    • 修飾的成員不能被外界直接訪問
    • 修飾的成員可以被子類直接訪問
    • 沒有protected就無法完成真正意義上的代碼複用

使用示例:

class Parent
{
//這裏使用關鍵字 protected來聲明
//子類就可以直接訪問到
//而且外界不可以直接訪問到
protected:
    int mv;
public:
    Parent()
    {
        mv = 100;
    }

    int value()
    {
        return mv;
    }
};

class Child : public Parent
{
public:
    int addValue(int v)
    {
        //子類可以直接使用父類的成員變量
        mv = mv + v;    
    }
};

繼承方式

  • C++中支持三種不同的繼承方式
    • public 繼承
      • 父類成員在子類中保持原有訪問級別
    • private 繼承
      • 父類成員在子類中變爲私有成員
    • protected 繼承
      • 父類中的公有成員變爲保護成員,其它成員保持不變
  • C++中的默認繼承方式爲private
  • 繼承方式比較
繼承方式\父類成員訪問級別 public protected private
public public protected private
protected protected protected private
private private private private
  • 注意:
    • 一般而言,C++工程項目中只使用public 繼承
    • C++的派生語言只支持一種繼承方式(public 繼承)
    • protected 和 private 繼承帶來的複雜性遠大於實用性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章