何时在c ++应用程序中使用虚拟析构函数

时间:2013-02-01 10:43:06

标签: c++

  

可能重复:
  When to use virtual destructors?

  

可能重复   When to use virtual destructors?

我想知道是否有人可以帮助我了解虚拟析构函数的需求。

我用一个主对话框编写了一个应用程序,从这个主对话框中将生成其他派生的对话框。

因此,所有这些派生的对话框都需要虚拟析构函数吗?或只是主对话框?

提前谢谢

4 个答案:

答案 0 :(得分:2)

通常,如果一个类被设计为用作基类, 它应该有一个虚拟析构函数。唯一的例外是 提供typedef之类的便利课程(参见 例如std::exception)。这些最安全的解决方案 是为了使析构函数受到保护,但实际上是他们的 语义是这样的,没有人创建指向它们的指针 无论如何,这个问题在实践中不会发生。

答案 1 :(得分:1)

当您打算以多态方式使用这些对象时,需要虚拟析构函数。对于基类析构函数来说,virtual就足够了;派生的析构函数也将隐式virtual

在你的情况下,看起来你不会多态地使用对话框,所以也许根本不需要虚拟析构函数。

答案 2 :(得分:-1)

如果要在链中调用所有析构函数,则必须始终创建虚拟析构函数。即使一个人是空的。

你错过了在某个时候创建​​一个虚拟析构函数C ++将创建一个非虚拟析构函数,因此将破坏所有析构函数链。

对于非虚拟析构函数,将在您明确删除的类指针上调用它们。如果您使用虚拟 - 将始终调用所有链。

答案 3 :(得分:-1)

简单的规则是“只要在类中有虚函数,就需要虚拟析构函数。”

一旦你在一个基类虚拟中创建了一个函数,它就会变成所有派生类的虚函数,无论你是否标记它。因此,如果你让主对话框析构函数为虚拟,那么你已经为所有其他人完成了这项工作[虽然我发现在查看类声明时立即看到函数是虚拟的很有用,并且不必向上移动几层类弄清楚它是否是]。