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

C++ 類繼承訪問控制全解析:public/protected/private 三種繼承語義差異

     編輯:VC 教學

C++ 支持三種繼承方式:**公有繼承** (`public`)、**保護繼承** (`protected`)、**私有繼承** (`private`)。它們決定了基類成員在派生類中的**訪問級別**,進而影響派生類的派生類 (多級繼承) 及外部代碼的可見性。本文通過完整代碼矩陣演示三種模式下成員訪問規則的本質差異。

核心規則:繼承方式 = 基類成員在派生類中的「最高訪問級」上限

基類成員public 繼承protected 繼承private 繼承
publicpublicprotectedprivate
protectedprotectedprotectedprivate
private不可訪問不可訪問不可訪問

關鍵點:基類 private 成員**永遠**對派生類不可見,無論繼承方式;protected 成員對派生類可見,但受繼承方式限制進一步降級。

完整驗證代碼 (可直接編譯運行)

#include <iostream>
using namespace std;

class Base {
public:    int a1; virtual void test() = 0;
protected: int a2;
private:   int a3;
};

// ---------- 保護繼承 ----------
class ProtectedClass : protected Base {
public:
    void test() override {
        a1 = 1;  // OK: public → protected
        a2 = 2;  // OK: protected → protected
        // a3 = 3; // Error: private 不可訪問
    }
};
class ControlProtectedClass : public ProtectedClass {
public:
    void test() override {
        a1 = 1;  // OK: 繼承鏈中仍為 protected
        a2 = 2;  // OK
        // a3 = 3; // Error
    }
};

// ---------- 私有繼承 ----------
class PrivateClass : private Base {
public:
    void test() override {
        a1 = 1;  // OK: public → private
        a2 = 2;  // OK: protected → private
        // a3 = 3; // Error
    }
};
class ControlPrivateClass : public PrivateClass {
public:
    void test() override {
        // a1 = 1; // Error: 在 PrivateClass 中已成 private
        // a2 = 2; // Error
        // a3 = 3; // Error
    }
};

// ---------- 公有繼承 ----------
class PublicClass : public Base {
public:
    void test() override {
        a1 = 1;  // OK: public 保持 public
        a2 = 2;  // OK: protected 保持 protected
        // a3 = 3; // Error
    }
};
class ControlPublicClass : public PublicClass {
public:
    void test() override {
        a1 = 1;  // OK
        a2 = 2;  // OK
        // a3 = 3; // Error
    }
};

int main() {
    // 編譯器會在錯誤行報錯,取消註釋可驗證
    system("pause");
    return 0;
}

外部代碼訪問權限對比

繼承方式派生類對象能否直接訪問基類 public 成員典型用途
public✅ 是 (IS-A 關係)接口繼承、多態基類
protected❌ 否 (變為 protected)實現繼承、受控擴展
private❌ 否 (變為 private)實現繼承、完全封裝基類

多級繼承中的傳遞規律

  • public 繼承鏈:訪問級別**不再降級**,`public`→`public`,`protected`→`protected`;
  • protected/private 繼承後再 public 繼承:無法恢復 已降級的訪問級別 (見 ControlProtectedClass/ControlPrivateClass);
  • 基類 private 成員**永遠阻斷** 向下傳遞。

工程實踐建議

  1. **默認使用 public 繼承** — 表達「是一種」語義,支持多態,符合里氏替換原則;
  2. protected/private 繼承**極少用於業務代碼**,主要見於庫實現細節 (如策略模式中的私有繼承策略類、CRTP 基類);
  3. 若需「有一種」關係,**優先組合 (Composition)** 而非私有繼承 — 耦合更低、語義更清晰;
  4. 代碼審查時,**禁止無註釋使用非 public 繼承** — 必須在類定義處說明設計意圖。

深刻理解三種繼承的訪問控制轉換規則,是掌握 C++ 物件模型、設計健壯類層次結構的基石。

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