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

C++ 構造與析構函數調用順序:基類、派生類、成員子對象完整規則

     編輯:C++ 入門

核心規則

構造順序:**基類 → 成員子對象 (按宣告順序) → 派生類本身**
析構順序:完全相反 (派生類 → 成員 → 基類)

範例 1:多重繼承同一基類

class Person { 
    Person() { cout << "Person ctor\n"; }
    ~Person() { cout << "Person dtor\n"; }
};
class Student : public Person { 
    Student() { cout << "Student ctor\n"; }
    ~Student() { cout << "Student dtor\n"; }
};
class Teacher : public Person { 
    Teacher() { cout << "Teacher ctor\n"; }
    ~Teacher() { cout << "Teacher dtor\n"; }
};

int main() {
    Student s; Teacher t;
}
/* 輸出:
Person ctor
Student ctor
Person ctor
Teacher ctor
Teacher dtor
Person dtor
Student dtor
Person dtor
*/

每個派生類物件包含獨立的基類子物件。

範例 2:成員子對象參與構造

class Data {
    Data(int x) : x(x) { cout << "Data ctor\n"; }
    ~Data() { cout << "Data dtor\n"; }
    int x;
};
class Base {
    Base(int x) : d1(x) { cout << "Base ctor\n"; }
    ~Base() { cout << "Base dtor\n"; }
    Data d1;
};
class Device : public Base {
    Device(int x) : Base(x), d2(x) { cout << "Device ctor\n"; }
    ~Device() { cout << "Device dtor\n"; }
    Data d2;
};

int main() { Device obj(5); }
/* 輸出:
Data ctor      (Base::d1)
Base ctor
Data ctor      (Device::d2)
Device ctor
Device dtor
Data dtor      (Device::d2)
Base dtor
Data dtor      (Base::d1)
*/

範例 3:預設參數與成員初始化列表

class Base {
public:
    Base(int xx = 0) : x(xx) { cout << "Base ctor\n"; }
    ~Base() { cout << "Base dtor\n"; }
    int x;
};
class Device : public Base {
public:
    Device(int xx = 0, int yy = 0) : Base(xx), y(yy), z(xx+yy) {
        cout << "Device ctor\n";
    }
    ~Device() { cout << "Device dtor\n"; }
    int y;
    Base z;  // 另一個 Base 成員
};
/* 輸出順序:
Base ctor (Base::Base(xx))
Base ctor (Device::z)
Device ctor
... dtor 反序
*/

關鍵規則總結

  1. 基類構造函數最先調用 (繼承圖由基至派)
  2. 成員子對象按**類別定義中宣告順序**構造 (非初始化列表順序)
  3. 派生類構造函數體最後執行
  4. 析構順序嚴格反序
  5. 基類預設參數可在派生類初始化列表中省略調用
  6. 虛繼承時虛基類最先構造,且由最派生類直接初始化

最佳實踐

  • 初始化列表順序與宣告順序一致,避免誤解
  • 基類解構函數宣告 virtual (Effective C++ 條款 7)
  • 成員盡量用初始化列表而非賦值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved