首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 基礎

C++ 繼承權限與繼承方式詳解:public/protected/private 三種模式的訪問控制邏輯

     編輯:C++ 基礎

繼承方式語法

class Derived : [繼承方式] Base { ... };  // 可選,默認 private

繼承方式限定基類成員在派生類中的最大訪問權限。

成員訪問權限基礎:public > protected > private

權限類外訪問派生類訪問
public是是
protected否是
private否否

三種繼承方式詳細規則表

繼承方式基類 public基類 protected基類 private
publicpublicprotected不可見
protectedprotectedprotected不可見
privateprivateprivate不可見

核心推論規則

  1. 上限原則:派生類中訪問權限 ≤ 繼承方式指定權限(高於者降級,低於者不升級)
  2. 私有不可見鐵律:基類 private 成員在派生類永遠不可見,無論繼承方式
  3. 設計指導:需派生類使用的成員 → public/protected;需封裝隱藏 → private
  4. protected 甜蜜點:既不對外暴露,又允許派生類使用

實戰:多級繼承權限傳遞

class People {
public: void setname(), setage(), sethobby(), gethobby();
protected: char* m_name; int m_age;
private: char* m_hobby;  // 派生類不可見
};

class Student : public People {  // public 繼承:權限保持
    protected: float m_score;
    public: void setscore();
};

class Pupil : public Student {  // public 繼承:權限保持
    private: int m_ranking;
    public: void display() {
        // 可直接訪問:m_name, m_age, m_score
        // m_hobby 不可見,必須通過 gethobby()/sethobby()
    }
};

using 改變成員訪問權限

class Base {
protected: int m_a, m_b;
public: void show();
};

class Derived : public Base {
public:
    using Base::m_a;  // protected → public
    using Base::m_b;  // protected → public
private:
    using Base::show;  // public → private
};
  • using Base::member; 在派生類中引入基類成員並指定新權限
  • 可提升(protected→public)或降級(public→private)
  • 無法改變 private 成員可見性(基類 private 本身不可見)

實務建議

  1. 絕大多數情況使用 public 繼承:保持「是一種」語義,權限不變
  2. protected/private 繼承極少用:語義模糊(實現繼承/包含),易誤解
  3. 組合優於私有繼承:class D { private: Base b; } 更清晰
  4. 善用 protected:給派生類用、不給外部用的成員
  5. 謹慎用 using 提權:破壞封裝,需充分理由

總結

繼承方式(public/protected/private)決定基類成員在派生類中的最大訪問權限上限。public 保持原權限,protected 將 public 降為 protected,private 全降為 private。基類 private 永遠不可見。現代 C++ 實務:幾乎只用 public 繼承,配合 protected 成員設計給派生類用,private 封裝細節,using 僅在極少數需改權限時使用。

  1. 上一篇文章:
  2. 下一篇文章:
  • --热点文章
  • Copyright © 程式碼之家 All Rights Reserved