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

C++ 類別繼承機制詳解:單繼承、多重繼承與繼承鏈的完整圖解

     編輯:C++ 入門

繼承核心概念

  • 基類/父類:被繼承的類別,定義共同屬性與行為。
  • 派生類/子類:繼承基類並擴展新特徵的類別。
  • 繼承鏈:多層繼承形成的層級結構,如 `A → B → C`。

單繼承:最基礎的擴展形式


class Base {
public:
    void common() {}
protected:
    int data_;
};
class Derived : public Base { // 訪問控制關鍵字
public:
    void extra() {}
};
  • 派生類擁有基類所有非私有成員。
  • 建構順序:基類建構函式 → 成員物件建構 → 派生類建構函式。
  • 解構順序:完全相反。

多重繼承:同時擁有多個基類


class Sensor { virtual void read() = 0; };
class Network { virtual void send() = 0; };
class SmartDevice : public Sensor, public Network {
    void read() override { /* ... */ }
    void send() override { /* ... */ }
};

優點:直接組合多個介面能力,無需介面+委託樣板代碼。
挑戰:

  • 名稱衝突:多基類同名成員需以 `Base1::func()` 明確限定。
  • 菱形繼承:兩條路徑共享同一間接基類 → 兩份拷貝。解法:虛擬繼承(`virtual public Base`)。
  • 物件佈局複雜:多重繼承物件包含多個基類子物件,指標轉型需調整位移(`this` 指標調整)。

虛擬繼承深度解析


class A { int x; };
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {}; // D 中只有一份 A::x
  • 虛基類由**最底層派生類(D)直接初始化**;中間類別(B、C)建構函式**不得**初始化虛基類。
  • 物件佈局引入 `vbptr`(虛基類表指標),間接存取虛基類成員,略增空間與存取開銷。
  • 僅在真正出現菱形且需共享狀態時使用;介面類別(純虛函式)通常無需虛繼承。

繼承鏈上的建構/解構與參數傳遞


class A { public: A(int) {} };
class B : public A { public: B(int a, int b) : A(a), b_(b) {} private: int b_; };
class C : public B { public: C(int a, int b, int c) : B(a, b), c_(c) {} private: int c_; };
  • 每層建構函式**必須**將所需參數向上傳遞給直接基類。
  • 成員初始化列表順序:基類 → 成員變數(依宣告順序),與列表書寫順序無關。
  • 解構函式自動鏈式呼叫,無需手動干預。

最佳實踐清單

  1. 優先使用 `public` 繼承表達 is-a;實作複用首選組合。
  2. 多重繼承僅用於「多個純介面類別 + 至多一個實作類別」模式。
  3. 虛擬繼承謹慎使用,文檔化說明共享語意。
  4. 基類解構函式**必須宣告為 `virtual`**,否則透過基類指標刪除派生物件導致未定義行為。
  5. 避免深層繼承鏈(>3 層),改用策略模式、裝飾器模式組合行為。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved