警告 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() {}
    };
}