c++ - 内部类析构函数在基类析构函数之后调用

标签 c++ c++11 destructor

我有一个基本而简单的问题。

我有这种情况:

#include <iostream>
using namespace std;

class Inner1
{
public:
    ~Inner1() {cout << "Inner1 Des\n";};
};

class Inner2
{
public:
    ~Inner2() {cout << "Inner2 Des\n";};
};

class Base
{
public:
    ~Base() {cout << "Base Des\n";};

    Inner1 inner1;
    Inner2 inner2;
};

int main() {
    Base base;
    return 0;
}

现在我的控制台告诉我:

Base destructor called
Inner2 destructor called
Inner1 destructor called

这是正常行为吗?因为某些功能的功能
已经在我的基类析构函数中被销毁,内部类依赖 在他们身上。

不推荐的解决方法:

只需在第一个位置添加一个带有对象的“Destroyer”类:

[...]
class Base
    {
    public:
        ~Base() {cout << "Base Des\n";};

        class Destroyer
        {
             ~Destroyer()
             {
                 //Put the stuff here because this destr will be called last
                 cout << "Destroyer Des\n";
             }
        } _destroyer;
        Inner1 inner1;
[...]

谢谢你的帮助

最佳答案

Is this the normal behavior?

是的。子对象析构函数由容器类的析构函数调用。特别是,子对象将在容器类析构函数的主体执行后被销毁。

Because the functionality for some functions is already destroyed in my Base Class destructor and the Inner classes rely on them.

只有当内部类 [sic] 析构函数依赖于包含它们的 Base 实例时才会出现问题。在这种情况下,Base 不应将它们作为成员包含,或者它们的析构函数不应依赖于 Base

关于c++ - 内部类析构函数在基类析构函数之后调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36882627/

相关文章:

c++ - 将即时任务添加到 `CFRunLoop` 的最简单方法?

c++ - 如何使用QVTKWidget

python - Cython:通过引用传递

c++ - 如何在不违反C++中的DRY原则的情况下实现可移动重载?

c++ - 如果 `f` 具有非空返回类型,则返回 `f` 的结果——如何重构此模式?

c++ - 在 std::map 和 std::unordered_map 之间进行选择

c++11 - 为什么 decltype 的行为是这样定义的?

c++ - 调用析构函数或调用 `delete` 时是否释放内存?

c++ - 指向 "raw"资源的指针应该在析构函数中归零吗?

c++ - 为什么调用 dtor(使用 annoymous/lambda func)