在 C++ 中,繼承的方式有三種:public
、protected
和 private
。它們控制了基類成員在派生類中的訪問許可權。以下是這三種繼承方式的區別:
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
繼承
- 基類的
public
和protected
成員在派生類中都變為protected
。 - 基類的
private
成員在派生類中依然不可訪問。
這種繼承方式通常表示「implemented-in-terms-of」的關係,表示派生類需要使用基類的功能,但不希望外部直接把派生類當作基類使用。
示例:
struct Derived : protected Base {
void func() {
publicVar = 1; // 作為 protected 可訪問
protectedVar = 2; // 可訪問
}
};
- 在這種繼承方式下,即使
publicVar
是基類中的public
成員,在Derived
中也只能作為protected
訪問,派生類的物件無法直接訪問publicVar
。
3. private
繼承
- 基類的
public
和protected
成員在派生類中都變為private
。 - 基類的
private
成員在派生類中依然不可訪問。
這種繼承方式表示「is-implemented-in-terms-of」的關係,通常用於派生類僅作為內部實現細節,不希望基類的介面直接暴露在派生類介面中。
示例:
struct Derived : private Base {
void func() {
publicVar = 1; // 作為 private 可訪問
protectedVar = 2; // 可訪問
}
};
- 在這種繼承方式下,基類的
public
和protected
成員在派生類中都變成private
,外部無法透過派生類物件訪問Base
的publicVar
。
總結
public
繼承:派生類物件可以作為基類物件使用,適合多型。protected
繼承:限制外部直接使用基類介面,適合僅內部繼承實現。private
繼承:更嚴格地封裝了基類的介面,使其僅在派生類內部可用。