在C ++ 11中考虑这两个类:
class A
{
ArbitraryClass someInstance;
};
class B : public A
{
};
并考虑我使用B
:
B *foo = new B;
delete foo;
据我所知,A
的隐式析构函数不会在此处调用。
在这种情况下someInstance
是否仍然被销毁,因为它与B
的成员“关联”了?或者我是否需要在A
上声明虚拟析构函数以自动触发成员的销毁?
答案 0 :(得分:6)
在delete
表达式的静态已知类(在您的情况下为B
)中需要一个虚拟析构函数,如果该类与对象的最派生类不同(在您的情况下也是{{1} }})。在你的情况下,这些类是相同的,所以你不需要虚拟析构函数:一切都被正确销毁。但是如果你已经指定了类型B
,那么你需要A*
中的虚拟析构函数来避免未定义的行为(鼻守护进程等)。
答案 1 :(得分:4)
我如何确保......
主要是无所事事。
据我所知,A的隐式析构函数不会在这里被调用。
错误。
在这种情况下
someInstance
是否仍被销毁
是
因为它变得"关联"作为B的成员?
因为它是A的成员,A被销毁。
或者我是否需要在A上声明一个虚拟析构函数来自动触发成员的破坏?
不是你发布的代码的情况,但是如果(很可能)你将通过删除指向A的指针来使用多态,这可能是B或A的其他子类,你应该给A一个虚拟的析构函数。