是否存在任何有效且可用的情况,这将迫使您不要在析构函数之前使用virtual
关键字。
class Base {
public:
virtual ~Base() { ... } // `virtual` causes error (not compile time or syntax) or wrong behaviour
// could contain other fields
};
// some example
答案 0 :(得分:6)
创建析构函数virtual
可能会将class
从非多态类型转换为多态类型。
请注意,多态类型永远不能简单地复制。因此,例如,您可以通过引入虚拟析构函数来中断对std::memcpy
的使用。
在某些情况下,尤其是与C进行交互时,这可能会造成严重破坏,因为您不能再假设class
实例的地址与第一个成员的地址相同。
参考:https://en.cppreference.com/w/cpp/types/is_trivially_copyable
答案 1 :(得分:3)
是否存在任何有效且可用的情况,这将迫使您不要在析构函数之前使用virtual关键字。
是的。如果您曾经将std::memcpy
或std::memcmp
与该类或其成员的实例一起使用,或依赖于指向/来自可转换为该类的第一个成员的实例的指针,或者检查了类类型的非活动工会成员。
通常:如果您依赖于类是标准布局类型或可微复制的类,则析构函数(以及所有其他成员函数)必须是非虚拟的。错误地假设标准布局或琐碎的大多数情况具有不确定的行为。可以使用特征类型和静态断言来强制执行这些属性,从而获得不错的编译错误。