不可能在析构函数上使用虚拟关键字

时间:2019-06-11 12:06:42

标签: c++

是否存在任何有效且可用的情况,这将迫使您不要在析构函数之前使用virtual关键字。

class Base {
public:
  virtual ~Base() { ... } // `virtual` causes error (not compile time or syntax) or wrong behaviour
  // could contain other fields

};

// some example 

2 个答案:

答案 0 :(得分:6)

创建析构函数virtual可能会将class从非多态类型转换为多态类型。

请注意,多态类型永远不能简单地复制。因此,例如,您可以通过引入虚拟析构函数来中断对std::memcpy的使用。

在某些情况下,尤其是与C进行交互时,这可能会造成严重破坏,因为您不能再假设class实例的地址与第一个成员的地址相同。

参考:https://en.cppreference.com/w/cpp/types/is_trivially_copyable

答案 1 :(得分:3)

  

是否存在任何有效且可用的情况,这将迫使您不要在析构函数之前使用virtual关键字。

是的。如果您曾经将std::memcpystd::memcmp与该类或其成员的实例一起使用,或依赖于指向/来自可转换为该类的第一个成员的实例的指针,或者检查了类类型的非活动工会成员。

通常:如果您依赖于类是标准布局类型或可微复制的类,则析构函数(以及所有其他成员函数)必须是非虚拟的。错误地假设标准布局或琐碎的大多数情况具有不确定的行为。可以使用特征类型和静态断言来强制执行这些属性,从而获得不错的编译错误。