[英]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::memcpy
或std::memcmp
与类或其成员的实例,或依赖指向/可从可转换为类的第一个成员的实例的指针,或检查非活动的公共初始序列类类型的联合成员。
通常:如果依赖于类是标准布局类型或平凡可复制类,那么析构函数(以及所有其他成员函数)必须是非虚拟的。 大多数错误地假设标准布局或无关紧要的情况都有不确定的行为。 可以使用类型特征和静态断言强制执行这些属性,这样您就可以获得一个很好的编译错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.