繁体   English   中英

无法在析构函数上使用虚拟关键字

[英]Impossible to use virtual keyword on destructor

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

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

};

// some example 

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

请注意,多态类型永远不会轻易复制 因此,例如,您可以通过引入虚拟析构函数来破坏std::memcpy的任何使用。

在某些情况下 - 特别是在与C互操作时 - 会造成严重破坏,因为您不能再认为您的class实例的地址与第一个成员的地址相同。

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

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

是。 如果你曾经使用std::memcpystd::memcmp与类或其成员的实例,或依赖指向/可从可转换为类的第一个成员的实例的指针,或检查非活动的公共初始序列类类型的联合成员。

通常:如果依赖于类是标准布局类型或平凡可复制类,那么析构函数(以及所有其他成员函数)必须是非虚拟的。 大多数错误地假设标准布局或无关紧要的情况都有不确定的行为。 可以使用类型特征和静态断言强制执行这些属性,这样您就可以获得一个很好的编译错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM