首頁 >後端開發 >C++ >C繼承中構造和析構的順序是什麼?

C繼承中構造和析構的順序是什麼?

DDD
DDD原創
2024-11-29 12:04:11765瀏覽

What's the Order of Construction and Destruction in C   Inheritance?

繼承中的構造和析構順序

考慮以下類別層次結構:

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

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

    A a;
};

當B 被創建(如int main() { B b; }),建構和銷毀順序遵循特定的規則:

建構順序:

  1. 基類建構子:先呼叫基底類別(A)的建構函數。
  2. 成員欄位建構:派生類別的成員欄位(B) 依照宣告的順序建構。在本例中,建構了類別 A 的實例 a。
  3. 衍生類別建構子: 最後呼叫衍生類別 (B) 的建構子。

這將轉換為以下呼叫順序:

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

銷毀順序:

  1. 衍生類析構函數: 先呼叫派生類別 (B) 的析構函數。
  2. 成員欄位銷毀: 衍生類別的成員欄位依照與建構時相反的順序銷毀。在這種情況下,類別 A 的實例 a 被銷毀。
  3. 基類析構函數: 最後呼叫基底類別 (A) 的析構函數。

這會導致以下破壞order:

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

因此,建構順序從基底類別開始,繼續到成員字段,最後到派生類別。銷毀順序與建構順序相反。

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

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