Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何确保销毁父实例成员?_C++_C++11 - Fatal编程技术网

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

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)不同

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

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很困惑,显然有阅读障碍。:')