警告 C26436
包含虚函数的类型“symbol”需要公共虚拟析构函数或受保护非虚拟析构函数 (c.35)
C++ Core Guidelines:C.35:基类析构函数应为公共和虚拟函数,或受保护的非虚拟函数
如果类定义虚拟函数,它将成为多态函数,这意味着派生类可以更改其行为,包括资源管理和销毁逻辑。 由于客户端代码可以通过指向基类的指针调用多态类型,因此客户端无法显式选择适当的行为,而无需向下转换。 为了确保资源一致地进行管理,并根据实际类型的规则进行销毁,你应该定义公共虚拟析构函数。 如果类型层次结构旨在禁止客户端代码直接销毁对象,则应将析构函数定义为受保护的非虚拟函数。
备注
该警告显示在类型的第一个虚拟函数定义中(如果不是公共函数,则可能是虚拟析构函数),每个类型一次。
由于定义可以独立于声明放置,因此它可能并不总是具有任何虚拟说明符。 但警告仍然有效:它会检查函数的实际“虚拟性”。
代码分析名称:NEED_VIRTUAL_DTOR
示例
namespace no_destructor
{
struct base {
virtual void foo() {} // C26436, see remarks to understand the placement of the warning.
};
}
当基类具有虚拟公共析构函数或受保护的非虚拟析构函数时,不会显示警告。
namespace virtual_destructor
{
struct base {
virtual ~base();
virtual void foo() {}
};
}
namespace protected_destructor
{
struct base {
virtual void foo() {}
protected:
~base() {}
};
}