即使不需要,我始终带有虚析构函数。除了可能会有一点点性能损失外,如果不需要一个虚拟析构函数,是否存在可能导致内存错误或其他可怕情况的情况呢?
谢谢
即使不需要,我始终带有虚析构函数。除了可能会有一点点性能损失外,如果不需要一个虚拟析构函数,是否存在可能导致内存错误或其他可怕情况的情况呢?
谢谢
把所有类都设计成可扩展的是一个基本缺陷。大多数类并不适合被继承,如果你没有从一开始就为扩展而设计类,那么这样做没有任何意义。
这只会误导使用API的用户,让他们认为这个类可以有意义地被继承。实际上,这种情况很少发生,并且最坏的情况是毫无益处或者破坏代码。
一旦你让一个类可继承,你就必须永远保持它的接口不变,绝不能破坏(隐含的!)语义。基本上,这个类不再是你的了。
另一方面,继承本来就被高估了。除了用于公共接口(纯虚类)外,通常应该优先选择组合而非继承。
另外,更为基本的一种情况是在需要使用 POD 的代码中时,虚拟析构函数是不可取的,例如在使用union
、与 C 代码进行交互或执行特定于 POD 的优化(只有 POD 是可平面化的,这意味着它们可以被非常高效地复制)时。不,据我所知。虚析构函数的行为要么与非虚析构函数完全相同(即虚函数调用和直接调用调用相同的函数),要么会导致未定义的行为。因此,您不能通过将非虚析构函数更改为虚析构函数来“做一些可怕的事情”。
但是,它可以暴露由代码其他部分引起的错误,例如当您意外覆盖对象的虚表指针时。