为什么 "child" object 析构函数在 "parent" object 析构函数之后执行?

Why does a "child" object destructor execute after the "parent" object destructor?

我有一个 class(“parent”),它的成员是另一个 class(“child”):

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"
};

“child”class定义为:

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

我在 main 中实例化“parent”,后者又(通过初始化列表)实例化“child”class:

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

    return(0);
}

基于 this question 在 SO 上的提问,以及逻辑上,我认为“child”object 的析构函数会在“parent" object 的析构函数。但是,当我执行这段代码时,输​​出是:

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

所以问题是:为什么“child”object析构函数在“parent”object析构函数之后执行?

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

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

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