首頁 >後端開發 >C++ >C 繼承中如何呼叫建構函式和析構函式?

C 繼承中如何呼叫建構函式和析構函式?

Patricia Arquette
Patricia Arquette原創
2024-11-29 04:10:09373瀏覽

How are Constructors and Destructors Called 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;
};

在主函數中:

int main() {
    B b;
}

這裡是管理此繼承層次結構中構造函式與析構函式呼叫順序的規則:

建構函式呼叫:

  1. 基底類別建構:建構函式呼叫以基底類別開始。在這種情況下,首先呼叫 A 的建構子。
  2. 成員欄位建構: 接下來,依照在衍生類別中宣告的順序建構成員欄位。在本例中,建構了 B 類型 A 的欄位 a。
  3. 衍生類別建構: 最後呼叫衍生類別 B 的建構子。

析構函式呼叫:

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

  1. 衍生類別析構函數: 先呼叫衍生類別B 的析構函數。
  2. 成員字段析構函數: 接下來,呼叫成員字段a 的析構函數,銷毀它的實例A.
  3. 基類析構函數:最後呼叫基底類別A 的析構函數。

預設初始化列表:

即使沒有明確定義的初始化列表,成員字段也會在派生類別構造函數之前初始化被稱為。在這種情況下,a將被初始化為A的預設建構子。

因此,main函數中程式碼的預期輸出將是:

A() C-tor
A() C-tor
B() C-tor
~B() D-tor
~A() D-tor
~A() D-tor

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

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