C++建構函式和解構函式呼叫順序詳解

2020-07-16 10:04:42
我們知道,每當建立一個類的物件時,編譯器都會自動呼叫建構函式。由於派生類的每個物件都可以被認為具有嵌入其中的基礎類別的物件,所以建立派生類物件涉及建立嵌入的基礎類別物件。

編譯器總是在呼叫派生類建構函式之前呼叫基礎類別建構函式。這個順序在派生類物件銷毀時就剛好反過來,即派生類中的解構函式在基礎類別的解構函式之前呼叫。

該順序允許派生類別建構函式和解構函式在工作中使用基礎類別的資料或成員函數。

下面的程式通過一個簡單的程式演示了這種表現。
// This program demonstrates the order in which base and
//derived class constructors and destructors are called.
#include <iostream>
#include <memory>
using namespace std;

// Base class
class BaseDemo
{
    public:
        BaseDemo() // Constructor
        {
            cout << "This is the BaseDemo constructor. n";
        }
        virtual ~BaseDemo() // Destructor
        {
            cout << "This is the BaseDemo destructor.n";
        }
};

// Derived class
class DeriDemo : public BaseDemo
{
    public:
        DeriDemo() // Constructor
        {
            cout << "This is the DeriDemo constructor.n";
        }
        virtual ~DeriDemo() // Destructor
        {
            cout << "This is the DeriDemo destructor.n";
        }
};
int main()
{
    cout << "We will now create a DeriDemo obj ect.n";
    shared_ptr<DeriDemo> d = make_shared<DeriDemo>(); cout << "The program is now going to,end.n";
    return 0;
}
程式輸出結果:

We will now create a DeriDemo obj ect.
This is the BaseDemo constructor.
This is the DeriDemo constructor.
The program is now going to,end.
This is the DeriDemo destructor.
This is the BaseDemo destructor.

注意,使用關鍵字 virtual 將基礎類別和派生類的解構函式定義為虛擬函式是一種很好的程式設計習慣。