【发布时间】:2014-12-10 19:08:15
【问题描述】:
据我所知,定义一个具有虚函数但非虚析构函数的类总是一个错误(或者至少是自找麻烦)。
因此(并考虑新创造的“零规则”),在我看来,隐式生成的析构函数对于任何具有至少一个其他虚函数的类应该自动是虚函数。
C++ 标准的某些未来版本强制执行此操作是否可行?或者换一种说法,是否有充分的理由在多态类中保持默认析构函数非虚拟?
编辑:为了清楚起见,我只是建议如果您不编写析构函数会发生什么——如果您自己编写析构函数,您当然可以像以往一样选择它是否是虚拟的。我只想看到默认匹配常见情况(不妨碍更高级的使用)。
【问题讨论】:
-
您并不总是从指向基类的指针中删除对象。事实上,您并不总是动态分配它们,即使您确实以多态方式使用它们。
-
没有为具有虚函数的类隐式生成析构函数。
-
@juanchopanza 当然不是。但是如果你有一个单一的虚函数,你还是要为 vtable 买单:虚析构函数还有什么额外的成本呢?在
delete的成本旁边,虚函数开销可以忽略不计,我本来以为 -
定义和调用虚拟析构函数都有运行时成本。 C++ 的一般原则是在不需要时不强加运行时成本;并且并不总是需要多态删除。
-
@ThomasMcLeod:是的。如果您不声明显式析构函数,所有类都会得到一个隐式析构函数。
标签: c++ destructor virtual-destructor