首頁 >後端開發 >C++ >C 繼承中建構函式和析構函式的呼叫順序是什麼?

C 繼承中建構函式和析構函式的呼叫順序是什麼?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-05 20:15:43973瀏覽

What's the Order of Constructor and Destructor Calls in C   Inheritance?

繼承中建構子和析構函式的呼叫順序

定義繼承類別時,了解建構子和析構函式的呼叫順序至關重要。考慮以下範例:

struct A {
    A() { cout << "A() C-tor" << endl; }
    ~A() { cout << "~A() D-tor" << endl; }
};

struct B : public A {
    B() { cout << "B() C-tor" << endl; }
    ~B() { cout << "~B() D-tor" << endl; }

    A a;
};

建構順序:

  1. 基類建構子: 基類的建構子(A )初始化派生物件的基礎部分。
  2. 成員字段建構:由於B有一個類型為A的字段,因此它的建構子會呼叫該字段的建構子。
  3. 衍生類別建構子:最後是衍生類別(B ) 完成了物件的初始化。

因此,建構順序是:

  • A()
  • A(a)
  • B()

銷毀順序:

析構函式以相反的順序呼叫建構:

  1. 衍生類析構函式:衍生類別(B)的析構函式啟動清理過程。
  2. 成員字段析構: A (a) 類型的字段被破壞。
  3. Base類析構函數:最後由基底類別(A)的析構函數完成銷毀。

銷毀順序是:

  • ~B()
  • ~A(a)
  • ~A()

初始化清單:

即使B 中沒有定義明確初始化列表,預設初始化列表由編譯器自動產生。此列表使用預設建構子初始化基底類別(A)和成員欄位(a)。

綜上所述,繼承中建構函式和析構函式的呼叫順序遵循特定規則:建構函式先初始化基底類,然後成員字段,最後是衍生類別。析構函數以相反的順序呼叫清理過程。了解這些規則對於使用繼承編寫健全的程式碼至關重要。

以上是C 繼承中建構函式和析構函式的呼叫順序是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn