- 此问题在此处已有答案**:
When to use virtual destructors?(20个答案)
昨天关门了。
我想知道是否有人能帮助我理解虚析构函数的必要性。
我已经编写了一个带有主对话框的应用程序,并且从这个主对话框派生出其他对话框。
因此,所有这些派生对话框都需要虚析构函数吗?还是只需要主对话框?
When to use virtual destructors?(20个答案)
昨天关门了。
我想知道是否有人能帮助我理解虚析构函数的必要性。
我已经编写了一个带有主对话框的应用程序,并且从这个主对话框派生出其他对话框。
因此,所有这些派生对话框都需要虚析构函数吗?还是只需要主对话框?
4条答案
按热度按时间5kgi1eie1#
一般来说,如果一个类被设计成基类,它应该有一个虚析构函数,唯一的例外是提供
typedef
这样的东西的方便类(例如,参见std::exception
)。最安全的解决方案是使析构函数受保护,但实际上,它们的语义是这样的:无论如何,没有人创建指向它们的指针,所以实际上不会出现这个问题。woobm2wo2#
当你打算多态地使用这些对象时,虚析构函数是必需的。基类析构函数为
virtual
就足够了;导出的析构函数也将隐式地为virtual
。在您的例子中,看起来您不会以多态的方式使用对话框,因此可能根本不需要虚拟析构函数。
fdbelqdn3#
简单的规则是“只要类中有虚函数,就需要一个虚析构函数”。
而且一旦你在基类中创建了一个函数virtual,那么不管你是否将它标记为virtual,它对于所有的派生类都将是virtual,所以如果你将主对话框析构函数创建为virtual,你就完成了所有其他函数的工作[尽管我发现在查看类声明时立即看到一个函数是virtual是很有用的,而不必遍历几层类来判断它是否是]。
11dmarpk4#
如果你希望所有的析构函数都在一个链中被调用,你必须总是创建一个虚析构函数,即使其中一个是空的。
如果你在某个时候错过了创建一个虚析构函数,C++将创建一个非虚析构函数,从而破坏所有的析构函数链。
对于非虚析构函数,它们将在你显式删除的类指针上被调用。如果你使用virtual - all,那么这个链将总是被调用。