C++ 支持三種繼承方式:**公有繼承** (`public`)、**保護繼承** (`protected`)、**私有繼承** (`private`)。它們決定了基類成員在派生類中的**訪問級別**,進而影響派生類的派生類 (多級繼承) 及外部代碼的可見性。本文通過完整代碼矩陣演示三種模式下成員訪問規則的本質差異。
| 基類成員 | public 繼承 | protected 繼承 | private 繼承 |
|---|---|---|---|
public | public | protected | private |
protected | protected | protected | private |
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) | 實現繼承、完全封裝基類 |
ControlProtectedClass/ControlPrivateClass);private 成員**永遠阻斷** 向下傳遞。public 繼承** — 表達「是一種」語義,支持多態,符合里氏替換原則;protected/private 繼承**極少用於業務代碼**,主要見於庫實現細節 (如策略模式中的私有繼承策略類、CRTP 基類);深刻理解三種繼承的訪問控制轉換規則,是掌握 C++ 物件模型、設計健壯類層次結構的基石。