C++中的繼承

海_纳百川發表於2024-11-08

在 C++ 中,繼承的方式有三種:publicprotectedprivate。它們控制了基類成員在派生類中的訪問許可權。以下是這三種繼承方式的區別:

1. public 繼承

  • 基類的 public 成員在派生類中保持 public
  • 基類的 protected 成員在派生類中保持 protected
  • 基類的 private 成員在派生類中不可訪問。

這種繼承方式表示「is-a」的關係,派生類物件可以當作基類物件使用(比如賦值或傳遞給函式時可以轉換為基類型別),適合用於多型性場景。

示例

struct Base {
    public:
        int publicVar;
    protected:
        int protectedVar;
    private:
        int privateVar;
};

struct Derived : public Base {
    void func() {
        publicVar = 1;     // 可訪問
        protectedVar = 2;  // 可訪問
        // privateVar = 3; // 不可訪問,編譯錯誤
    }
};

2. protected 繼承

  • 基類的 publicprotected 成員在派生類中都變為 protected
  • 基類的 private 成員在派生類中依然不可訪問。

這種繼承方式通常表示「implemented-in-terms-of」的關係,表示派生類需要使用基類的功能,但不希望外部直接把派生類當作基類使用。

示例

struct Derived : protected Base {
    void func() {
        publicVar = 1;     // 作為 protected 可訪問
        protectedVar = 2;  // 可訪問
    }
};
  • 在這種繼承方式下,即使 publicVar 是基類中的 public 成員,在 Derived 中也只能作為 protected 訪問,派生類的物件無法直接訪問 publicVar

3. private 繼承

  • 基類的 publicprotected 成員在派生類中都變為 private
  • 基類的 private 成員在派生類中依然不可訪問。

這種繼承方式表示「is-implemented-in-terms-of」的關係,通常用於派生類僅作為內部實現細節,不希望基類的介面直接暴露在派生類介面中。

示例

struct Derived : private Base {
    void func() {
        publicVar = 1;     // 作為 private 可訪問
        protectedVar = 2;  // 可訪問
    }
};
  • 在這種繼承方式下,基類的 publicprotected 成員在派生類中都變成 private,外部無法透過派生類物件訪問 BasepublicVar

總結

  • public 繼承:派生類物件可以作為基類物件使用,適合多型。
  • protected 繼承:限制外部直接使用基類介面,適合僅內部繼承實現。
  • private 繼承:更嚴格地封裝了基類的介面,使其僅在派生類內部可用。

相關文章