可能重复:
何时使用虚拟析构函数?
何时使用虚拟析构函数可能重复 ?
我想知道是否有人可以帮助我了解虚拟析构函数的需求。
我已经编写了一个带有主对话框的应用程序,并且从这个主对话框中将产生其他派生对话框。
因此,所有这些派生对话框都需要虚拟析构函数吗?还是只是主对话框?
先感谢您
可能重复:
何时使用虚拟析构函数?
何时使用虚拟析构函数可能重复 ?
我想知道是否有人可以帮助我了解虚拟析构函数的需求。
我已经编写了一个带有主对话框的应用程序,并且从这个主对话框中将产生其他派生对话框。
因此,所有这些派生对话框都需要虚拟析构函数吗?还是只是主对话框?
先感谢您
一般来说,如果一个类被设计为用作基类,它应该有一个虚拟析构函数。唯一的例外是提供类似typedef
(参见示例std::exception
)的便利类。最安全的解决方案是使析构函数受到保护,但实际上,它们的语义使得无论如何都没有人创建指向它们的指针,因此在实践中不会出现问题。
当您要以多态方式使用这些对象时,需要虚拟析构函数。基类析构函数就足够了virtual
;派生的析构函数也将是隐式virtual
的。
在您的情况下,您似乎不会以多态方式使用对话框,因此您可能根本不需要虚拟析构函数。
如果您希望在链中调用所有析构函数,则必须始终创建一个虚拟析构函数。哪怕一个是空的。
如果您错过了在某些时候创建虚拟析构函数,C++ 将创建一个非虚拟析构函数,因此会破坏所有析构函数链。
对于非虚拟析构函数,它们将在您显式删除的类指针上调用。如果您使用虚拟 - 将始终调用所有链。
简单的规则是“只要类中有虚函数,就需要一个虚析构函数”。
一旦你在基类中创建了一个函数,它对于所有派生类都将变为虚拟,无论你是否将其标记为虚拟。因此,如果您将主对话框析构函数设为虚拟,那么您已经为所有其他人完成了这项工作[尽管我发现在查看类声明时立即看到一个函数是虚拟的很有用,而不必遍历几层类弄清楚它是否存在]。