0

准则 #4链接文本,状态:

基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的。

可能我遗漏了一些东西,但是如果我只是创建一个具体的类,它不是设计为用作基类的。

我应该声明它是公共的和虚拟的析构函数吗?通过这种方式,我隐含地声明我的类“已准备好用作基类”,虽然这不是必须的。

4

6 回答 6

5

链接文本特别说“基类析构函数应该是”......

这些指南仅适用于设计用作基类的类。如果您正在创建一个不会用作基类的单个具体类,则应该将公共构造函数保留为非虚拟的。

于 2009-11-10T21:07:54.507 回答
0

在以下任何一种情况下,析构函数应该是虚拟的:

  • 您的类包含任何虚拟方法。
  • 即使没有什么是虚拟的,您也打算使用类作为基础。

罕见的例外

  • 您正在尝试保存 4 个字节,因此虚拟表指针不是可接受的解决方案(例如 - 由于某种原因,您的类必须适合 32 位)。但要为地狱做好准备。

关于公共或受保护 - 通常更多的是您打算如何控制对析构函数的访问。

于 2009-11-10T21:27:29.670 回答
0

如果您的班级中没有其他东西是虚拟的,那么我认为析构函数也不应该是虚拟的。

于 2009-11-10T21:06:08.730 回答
0

如果您的类稍后将被扩展,您的析构函数只需要是虚拟的。我不知道您需要受保护/私有析构函数的情况。

值得注意的是,即使你有一个虚拟方法,你也不会失去任何东西(对于大多数编译器),使析构函数也是虚拟的(但它会保护你,以防以后有人扩展)。

于 2009-11-10T21:06:26.110 回答
0

建议指的是具有虚函数的类,旨在成为多态基类。您必须确保如果有人调用delete基类指针,则调用实际类的析构函数;否则,派生类分配的资源将不会被释放。

有两种方法可以实现这一点:

  • 公共虚拟析构函数,因此在运行时可以找到正确的析构函数;或者
  • 受保护的非虚拟析构函数,可防止调用delete基类指针。

对于不会用作基类的具体类,您只会调用delete指向实际类型的指针,因此建议不适用。如果需要,它应该有一个公共的非虚拟析构函数。

于 2009-11-10T21:59:14.903 回答
0

换一种方式考虑:你知道没有人绝对会尝试从你的课程中派生出来,当有人这样做时,你认为他会记得仔细看看你的 dtor 吗?有时人们出于充分的理由使用继承而不是组合(提供类的完整接口而没有丑陋的 getter 语法)。
虚拟 dtor 的另一点是Open/Closed Principle
如果您不关心硬实时性能或类似的东西,我会选择虚拟 dtor。

于 2009-11-10T21:21:24.853 回答