如何确保父实例成员的销毁

How do I ensure the destruction of a parent instance member?

本文关键字:成员 实例 何确保 确保      更新时间:2023-10-16

考虑C++11中的这两个类:

class A
{
    ArbitraryClass someInstance;
};
class B : public A
{
};

并考虑我这样使用B

B *foo = new B;
delete foo;

据我了解,这里不会调用A的隐式析构函数。

在这种情况下,someInstance是否仍然被摧毁,因为它成为B成员的"关联"?还是需要在A上声明虚拟析构函数以自动触发成员的销毁?

如果delete表达式的静态已知类(在您的例子中B)中需要一个虚拟析构函数,如果该类与对象的最派生类不同(在您的例子中也是B)。在你的例子中,这些类是相同的,所以你不需要虚拟析构函数:一切都被正确地销毁了。但是,如果您已将指针类型设为A*,那么您将需要A中的虚拟析构函数来避免未定义行为(鼻守护程序等)。

我如何确保...

主要是什么都不做。

据我了解,这里不会调用 A 的隐式析构函数。

错。

在这种情况下,someInstance仍然被摧毁吗

是的。

因为它成为 B 的成员"关联"?

因为它是A的成员,而A被销毁了。

还是我需要在 A 上声明一个虚拟析构函数来自动触发成员的销毁?

不是在您发布的代码的情况下,但如果(很可能)您将通过删除指向 A 的指针(可能是 B 或 A 的其他子类)来使用多态性,您应该为 A 提供一个虚拟析构函数。