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

C++ 繼承機制詳解:基類與派生類的三種繼承方式與存取權限完整對照表

     編輯:關於C++

C++ 繼承機制完整解析:基類與派生類存取權限控制

C++ 透過繼承機制讓現有類別(基類)衍生出新類別(派生類)。派生類擁有基類所有非私有成員,並可新增自身成員。繼承方式決定基類成員在派生類中的可見性。

三種繼承方式對比

繼承方式關鍵字基類 public → 派生類基類 protected → 派生類基類 private → 派生類
公有繼承publicpublicprotected不可存取
私有繼承private(預設)privateprivate不可存取
保護繼承protectedprotectedprotected不可存取

核心規則總結

  1. 基類 private 成員永遠不可被派生類直接存取(只能透過基類 public/protected 成員函數間接存取)
  2. public 繼承:「is-a」關係,保持介面公開性,最常用
  3. private 繼承:「implemented-in-terms-of」,基類介面對外隱藏,甚至派生類的派生類也無法存取
  4. protected 繼承:介於兩者間,基類介面對派生類可見但對外隱藏

完整程式碼示範

#include <iostream>
using namespace std;

class Base {
public:    int a1;
protected: int a2;
private:   int a3;
};

// 公有繼承
class D1 : public Base {
public:
    void test() {
        a1 = 10; // ✓ public
        a2 = 20; // ✓ protected
        // a3 = 30; // ✗ private
    }
};
class D11 : public D1 {
public:
    void test() {
        a1 = 5;  // ✓ D1 中為 public
        a2 = 6;  // ✓ D1 中為 protected
        // a3 = 7; // ✗
    }
};

// 私有繼承
class D2 : private Base {
public:
    void test() {
        a1 = 8;  // ✓ 變為 private
        a2 = 9;  // ✓ 變為 private
        // a3 = 10; // ✗
    }
};
class D22 : public D2 {
public:
    void test() {
        // a1 = 11; // ✗ D2 中為 private
        // a2 = 12; // ✗
        // a3 = 13; // ✗
    }
};

// 保護繼承
class D3 : protected Base {
public:
    void test() {
        a1 = 15; // ✓ 變為 protected
        a2 = 16; // ✓ 變為 protected
        // a3 = 17; // ✗
    }
};
class D33 : public D3 {
public:
    void test() {
        a1 = 18; // ✓ D3 中為 protected
        a2 = 19; // ✓
        // a3 = 20; // ✗
    }
};

int main() {
    D11 d1; d1.a1 = 1; // ✓ public 繼承鏈保持 public
    // d1.a2 = 2; // ✗ protected
    
    D22 d2; 
    // d2.a1 = 4; // ✗ private 繼承鏈全變 private
    
    D33 d3;
    // d3.a1 = 7; // ✗ protected 繼承鏈對外不可見
    return 0;
}

派生類物件存取基類成員規則

  • public 繼承:僅基類 public 成員可被派生類物件直接存取
  • private/protected 繼承:基類所有成員均不可被派生類物件直接存取

最佳實務建議

  1. 優先使用 public 繼承 建立「is-a」關係
  2. 需隱藏基類介面時考慮 組合(composition) 替代私有繼承
  3. protected 繼承極少使用,通常表示設計問題
  4. 基類資料成員建議設為 private,提供 protected 存取器給派生類
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved