C++ 如何确保销毁父实例成员?
考虑C++11中的这两个类:C++ 如何确保销毁父实例成员?,c++,c++11,C++,C++11,考虑C++11中的这两个类: class A { ArbitraryClass someInstance; }; class B : public A { }; 并考虑使用 b>代码>: B *foo = new B; delete foo; 据我所知,这里不会调用A的隐式析构函数 在这些情况下,someInstance是否仍然被销毁,因为它作为B的一个成员“关联”?或者我是否需要在a上声明一个虚拟析构函数以自动触发成员的销毁?如果某个类与对象的最派生类(在您的情况下也是B)不同
class A
{
ArbitraryClass someInstance;
};
class B : public A
{
};
并考虑使用<代码> b>代码>:
B *foo = new B;
delete foo;
据我所知,这里不会调用
A
的隐式析构函数
在这些情况下,
someInstance
是否仍然被销毁,因为它作为B
的一个成员“关联”?或者我是否需要在a
上声明一个虚拟析构函数以自动触发成员的销毁?如果某个类与对象的最派生类(在您的情况下也是B
)不同,则在删除表达式的静态已知类中需要一个虚拟析构函数。在您的例子中,这些类是相同的,所以您不需要虚拟析构函数:所有的东西都被正确地销毁了。但是,如果您将指针类型设置为A*
,则需要在A
中使用虚拟析构函数来避免未定义的行为(后台进程等)
我如何确保
主要是什么都不做
据我所知,这里不会调用A的隐式析构函数
错
在这种情况下,someInstance
是否仍被销毁
对
因为它成为了B的成员
因为它是a的成员,而a被销毁
或者我需要在上声明一个虚拟析构函数来自动触发成员的销毁吗
对于您发布的代码,情况并非如此,但如果(很可能)您将通过删除指向A的指针(可能是B或A的其他子类)来使用多态性,您应该给A一个虚拟析构函数。“据我所知,这里不会调用A的隐式析构函数。”您认为这是为什么?你试过了吗?如果没有虚拟析构函数,对象的静态变量类型将与所有父类型一起调用其析构函数。使用虚拟析构函数,动态对象类型的析构函数将与其所有父类型一起被调用。如果someInstance
是B
的成员,foo
是a*
@xaxxon,那么你的问题就更有意义了(作为理解的一点,而不是混淆),我误读了把D
和B
类混在一起的内容——这就是我的混淆,也是错误的陈述。这就把一切都清理干净了。@WhozCraig很困惑,显然有阅读障碍。:')