| 繼承方式 | 基類 public → 派生類 | 基類 protected → 派生類 | 基類 private → 派生類 | 典型用途 |
|---|---|---|---|---|
public (IS-A) | public | protected | 不可訪問 | 介面繼承、多態基類 |
protected | protected | protected | 不可訪問 | 受控繼承、實現細節隱藏 |
private (HAS-A / Implemented-in-terms-of) | private | private | 不可訪問 | 組合替代、實現繼承 |
無論繼承方式如何,基類 private 成員對派生類**不可見**,只能通過基類 public/protected 介面間接存取。
class Base {
public: int pub = 1;
protected: int pro = 2;
private: int pri = 3;
};
// 1. public 繼承:介面保持
class PubDerived : public Base {
void test() { pub=1; pro=2; /* pri=3 錯誤 */ }
};
class PubUser : public PubDerived {
void test() { pub=1; pro=2; /* pri=3 錯誤 */ }
};
// 2. protected 繼承:介面降級為 protected
class ProDerived : protected Base {
void test() { pub=1; pro=2; /* pri=3 錯誤 */ }
};
class ProUser : public ProDerived {
void test() { pub=1; pro=2; /* pri=3 錯誤 */ } // 仍可訪問,但屬性為 protected
};
// 3. private 繼承:介面完全封裝
class PriDerived : private Base {
void test() { pub=1; pro=2; /* pri=3 錯誤 */ }
};
class PriUser : public PriDerived {
void test() { /* pub=1 錯誤 */ /* pro=2 錯誤 */ /* pri=3 錯誤 */ } // 全部不可訪問
};
Base (pub/pro/pri)
│
├─ public 繼承 → 子類存取級 = 基類存取級
│ pub→pub, pro→pro, pri→不可訪問
│
├─ protected 繼承 → 子類存取級 = min(基類存取級, protected)
│ pub→pro, pro→pro, pri→不可訪問
│
└─ private 繼承 → 子類存取級 = private
pub→pri, pro→pri, pri→不可訪問
protected 成員或重載 virtual 函數時使用。using 宣告暴露特定基類成員:class Widget : private Timer { // 利用 Timer 實現定時功能
public:
using Timer::start; // 選擇性暴露
using Timer::stop;
// 外部不可用 Timer::setInterval 等
};
class Base { public: void foo(); protected: void bar(); };
class Derived : private Base {
public:
using Base::foo; // 將 private 繼承的 foo 恢復為 public
// bar 仍為 private
};
| 誤區 | 正確理解 |
|---|---|
| private 繼承隱藏基類所有成員 | 基類 public/protected 成員在派生類內部**可訪問**(但變為 private),僅對外隱藏 |
| protected 繼承比 private 繼承「更開放」 | 對「進一步派生類」較開放,對「外部使用者」同樣隱藏 |
| 繼承方式影響物件大小 | **不影響**,僅影響編譯期存取檢查,無運行期開銷 |
| 構造/解構函數受繼承方式影響 | **不影響**,基類構造函數總是被調用,順序固定 |
using 精準暴露必要介面。final (C++11) 禁止進一步繼承,用 override 確保正確重載。繼承存取控制是**編譯期靜態規則**,核心邏輯:
private 成員**永遠**對派生類不可見。public 繼承保持介面層級;protected 降級為 protected;private 全部降級為 private。