【问题标题】:Could the implicit destructor of a polymorphic class be made virtual?可以将多态类的隐式析构函数设为虚拟吗?
【发布时间】:2014-12-10 19:08:15
【问题描述】:

据我所知,定义一个具有虚函数但非虚析构函数的类总是一个错误(或者至少是自找麻烦)。

因此(并考虑新创造的“零规则”),在我看来,隐式生成的析构函数对于任何具有至少一个其他虚函数的类应该自动是虚函数。

C++ 标准的某些未来版本强制执行此操作是否可行?或者换一种说法,是否有充分的理由在多态类中保持默认析构函数非虚拟?

编辑:为了清楚起见,我只是建议如果您编写析构函数会发生什么——如果您自己编写析构函数,您当然可以像以往一样选择它是否是虚拟的。我只想看到默认匹配常见情况(不妨碍更高级的使用)。

【问题讨论】:

  • 您并不总是从指向基类的指针中删除对象。事实上,您并不总是动态分配它们,即使您确实以多态方式使用它们。
  • 没有为具有虚函数的类隐式生成析构函数。
  • @juanchopanza 当然不是。但是如果你有一个单一的虚函数,你还是要为 vtable 买单:虚析构函数还有什么额外的成本呢?在delete 的成本旁边,虚函数开销可以忽略不计,我本来以为
  • 定义和调用虚拟析构函数都有运行时成本。 C++ 的一般原则是在不需要时不强加运行时成本;并且并不总是需要多态删除。
  • @ThomasMcLeod:是的。如果您不声明显式析构函数,所有类都会得到一个隐式析构函数。

标签: c++ destructor virtual-destructor


【解决方案1】:

如果您不想或不需要多态地删除此类对象,则不需要析构函数是虚拟的。相反,它可以是基类中的protected 非虚拟,只允许以非多态方式删除。要求它自动虚拟化会给不需要多态销毁的应用程序带来不必要的成本。

【讨论】:

  • 我并不是建议析构函数必须始终是虚拟的,但只有在您不提供析构函数时才会发生。如果您自己编写(因为您必须将其设为protected),您可以像以往一样选择是否为虚拟。我只想看到默认匹配常见情况(不妨碍更高级的使用)。
猜你喜欢
  • 2015-06-04
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 2016-01-16
  • 2014-02-23
  • 2021-08-22
  • 2011-01-12
相关资源
最近更新 更多