是否存在任何有效和可用的情况,会迫使您在析构函数之前不使用虚拟
关键字。
class Base {
public:
virtual ~Base() { ... } // `virtual` causes error (not compile time or syntax) or wrong behaviour
// could contain other fields
};
// some example
是否存在任何有效和可用的情况,会迫使您在析构函数之前不使用虚拟
关键字。
class Base {
public:
virtual ~Base() { ... } // `virtual` causes error (not compile time or syntax) or wrong behaviour
// could contain other fields
};
// some example
将析构函数定义为virtual
有可能将您的class
从非多态类型转换为多态类型。
请注意,多态类型永远不是平凡可复制的(trivially copyable)。例如,引入虚拟析构函数可能会破坏对std::memcpy
的任何使用。
在某些情况下,特别是与C进行交互时,这可能会造成混乱,因为您不能再假设实例的地址与第一个成员的地址相同。
参考:https://en.cppreference.com/w/cpp/types/is_trivially_copyable
std::memcpy
或std::memcmp
与类的实例或其成员,或者依赖于指向/来自实例的指针可以转换为该类的第一个成员,或者检查该类类型的非活动联合成员的公共初始序列。
virtual
。它不会产生任何编译器/语法错误,但会导致错误的行为。 - arsdever