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

时间:2017-01-29 05:41:01

标签: c++ c++11

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

class A
{
    ArbitraryClass someInstance;
};

class B : public A
{

};

并考虑我使用B

B *foo = new B;
delete foo;

据我所知,A的隐式析构函数不会在此处调用。

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

  

我如何确保......

主要是无所事事。

  

据我所知,A的隐式析构函数不会在这里被调用。

错误。

  

在这种情况下someInstance是否仍被销毁

  

因为它变得"关联"作为B的成员?

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

  

或者我是否需要在A上声明一个虚拟析构函数来自动触发成员的破坏?

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