【问题标题】:How do I ensure the destruction of a parent instance member?如何确保销毁父实例成员?
【发布时间】:2017-06-14 13:15:42
【问题描述】:

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

class A
{
    ArbitraryClass someInstance;
};

class B : public A
{

};

并考虑我这样使用B

B *foo = new B;
delete foo;

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

someInstance 在这些情况下是否仍然被销毁,因为它成为“关联”为B 的成员?还是我需要在A上声明一个虚拟析构函数来自动触发成员的销毁?

【问题讨论】:

  • "据我了解,这里不会调用 A 的隐式析构函数。"为什么你这么想?你试过了吗?如果没有虚拟析构函数,对象的静态变量类型将与所有父类型一起调用其析构函数。使用虚拟析构函数,动态对象类型将调用其析构函数及其所有父类型。
  • 我想你很困惑。如果someInstanceB 的成员,而fooA*,您的问题会更有意义(作为理解点,而不是混淆)。
  • @xaxxon 我误读了 this answer was suggesting, 混淆了 DB 类的内容——这就是我的困惑,因此是错误的陈述。这清除了一切。
  • @WhozCraig 困惑,显然有阅读障碍。 :')

标签: c++ c++11


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我如何确保...

    主要是什么都不做。

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

    错了。

    someInstance 在这种情况下是否仍然被破坏

    是的。

    因为它成为 B 的成员“关联”?

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      相关资源
      最近更新 更多