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

VC++ 深度解析 C++ 類別繼承:基礎語法、建構/解構順序、IS-A 關係

     編輯:VC 教學

前言

繼承是 C++ 實現 **IS-A** 關係、程式碼重用與多態的核心機制。本文以 Animal 基類與 Fish 衍生類為例,完整說明繼承語法、public 繼承語意、建構函數/解構函數調用順序,並驗證「父類先建構、子類後建構;解構順序相反」的鐵律。

基本繼承語法


class Animal {                // 基類 / 父類
public:
    void eat()   { cout << "animal eat\n"; }
    void sleep() { cout << "animal sleep\n"; }
    void breathe(){ cout << "animal breathe\n"; }
};

class Fish : public Animal {  // 衍生類 / 子類,public 繼承
    // 無自有成員,繼承 Animal 所有 public/protected 成員
};

int main() {
    Animal an; Fish fh;
    an.eat();  // animal eat
    fh.eat();  // animal eat (繼承而來)
}
  • public 繼承:基類 public 成員在衍生類保持 public,**IS-A 關係** (Fish *是一個* Animal)。
  • protected 成員:衍生類可存取,外部不可存取。
  • private 成員:衍生類**不可直接存取** (但佔記憶體、隨物件建構/解構)。

建構/解構順序驗證


class Animal {
public:
    Animal() { cout << "animal construct\n"; }
    ~Animal() { cout << "animal destruct\n"; }
    // ...
};

class Fish : public Animal {
public:
    Fish() { cout << "fish construct\n"; }
    ~Fish() { cout << "fish destruct\n"; }
};

int main() {
    Fish fh;
}

輸出結果


animal construct
fish construct
fish destruct
animal destruct

鐵律

  1. 建構:基類 → 衍生類 (由外而內)。
  2. 解構:衍生類 → 基類 (由內而外)。
  3. 原因:衍生類物件**包含**基類子物件,必須先完成基類初始化,衍生類才能安全使用基類資源;解構時先清理衍生類資源,再交還基類清理。

記憶體佈局模型


+------------------+
| Animal 部分      |  ← 基類子物件 (vptr 若有虛函數)
| - 成員變數       |
+------------------+
| Fish 部分        |  ← 衍生類自有成員
| - 成員變數       |
+------------------+
```
Fish* 指向整個區塊起始;轉型為 Animal* 仍指向同一位址 (單一繼承無位移)。

衍生類呼叫基類帶參數建構函數

若基類**無預設建構函數** (僅有帶參數版),衍生類**必須**在成員初始化清單顯式呼叫:


class Animal {
public:
    Animal(int h, int w) { cout << "animal construct h="<

同樣適用於**初始化 const 成員**或**參考成員**:


class Point {
    const int x, y;
public:
    Point(int a, int b) : x(a), y(b) {} // 唯一初始化管道
};

繼承存取指定符影響表

實務建議:幾乎只用 public 繼承 (IS-A);protected/private 繼承屬「實作繼承」 (HAS-A),優先考慮**組合** (class Fish { Animal a; })。

總結

C++ 繼承核心觀念:IS-A 語意 (public 繼承)、**建構由外而內 / 解構由內而外**、衍生類必須初始化基類子物件 (若無預設建構函數需顯式呼叫)。掌握順序與記憶體模型,能正確設計資源管理 (RAII)、避免建構期存取未初始化基類成員、正確實作虛解構函數確保多態刪除安全。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
基類成員public 繼承protected 繼承private 繼承
publicpublicprotectedprivate
protectedprotectedprotectedprivate
private不可存取不可存取不可存取