C++构造函数和析构函数调用顺序详解

我们知道,每当创建一个类的对象时,编译器都会自动调用构造函数。由于派生类的每个对象都可以被认为具有嵌入其中的基类的对象,所以创建派生类对象涉及创建嵌入的基类对象。

编译器总是在调用派生类构造函数之前调用基类构造函数。这个顺序在派生类对象销毁时就刚好反过来,即派生类中的析构函数在基类的析构函数之前调用。

该顺序允许派生类的构造函数和析构函数在工作中使用基类的数据或成员函数。

下面的程序通过一个简单的程序演示了这种表现。
// 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 将基类和派生类的析构函数定义为虚函数是一种很好的编程习惯。