为什么“子”对象析构函数在“父”对象析构函数之后执行?

时间:2021-04-03 19:21:56

标签: c++ object destructor

我有一个类(“父类”),它有另一个类(“子类”)的成员:

class Engine   // THE "PARENT" CLASS
{
    public:
        // CONSTRUCTOR ------------------------------------
        Engine() : mConfig {}  // "CHILD" CLASS INITIALIZED HERE
        {
            // ...
            return;
        }

        // DESTRUCTOR -------------------------------------
        ~Engine()
        {
            std::cout << "Engine destructor executing...\n";
            // ...
            return;
        }

    private:
        GameConfig  mConfig;  // THE "CHILD" CLASS AS MEMBER OF "PARENT"
};

“子”类定义为:

class GameConfig   // THE "CHILD" CLASS DEFINITION
{
    public:
        // ...
        // DESTRUCTOR -------------------------------------
        ~GameConfig()
        {
            std::cout << "Writing config data...\n";
            // ...
            return;
        }
};

我在 main 中实例化了“parent”,然后(通过初始化列表)实例化了“child”类:

int main()
{
    Engine gameEngine {};
    // ...
    std::cout << "Goodbye!\n";

    return(0);
}

基于 this question 对 SO 的要求,以及逻辑上,我认为“子”对象的析构函数会在“父”对象的析构函数之前被调用。但是,当我执行这段代码时,输​​出是:

Goodbye!
Engine destructor executing...
Writing config data...

那么问题是:为什么“子”对象析构函数在“父”对象析构函数之后执行?

1 个答案:

答案 0 :(得分:1)

(我将避免使用“父”和“子”,因为这些术语通常指的是通过继承而不是组合相关的类。)

销毁 C++ 对象涉及执行其析构函数的主体和编译器自动生成的其他销毁工作,例如销毁成员对象和调用基类析构函数。

额外的工作必须在调用析构函数体之后发生。如果它发生在之前,则包含对象的析构函数将无法对其成员执行任何操作,这在大多数情况下会使析构函数无用。

相关问题