构造函数的调用顺序

  1. 基类构造函数:首先调用基类(父类)的构造函数。

  2. 成员变量构造函数:然后按照成员变量在类中声明的顺序调用它们的构造函数。

  3. 派生类构造函数:最后调用派生类(子类)的构造函数。

析构函数的调用顺序(完全与构造相反)

  1. 派生类析构函数:首先调用派生类(子类)的析构函数。

  2. 成员变量析构函数:然后按照成员变量在类中声明的逆序调用它们的析构函数。

  3. 基类析构函数:最后调用基类(父类)的析构函数。

示例代码

#include <iostream>

class Base {
public:
    Base() {
        std::cout << "father constructor\n";
    }
    ~Base() {
        std::cout << "father destructor\n";
    }
};

class Member {
public:
    Member() {
        std::cout << "Member constructor\n";
    }
    ~Member() {
        std::cout << "Member destructor\n";
    }
};

class Derived : public Base {
    Member m;
public:
    Derived() {
        std::cout << "child constructor\n";
    }
    ~Derived() {
        std::cout << "child destructor\n";
    }
};

int main() {
    Derived d;
    std::cout << " ----------- " <<std::endl;
    return 0;
}

输出情况

//  顺序:父->成员->子
father constructor
Member constructor
child constructor
------------------
//  顺序:子->成员->父
child destructor
Member destructor
father destructor

山和山不相遇,人与人要相逢