cppcoreguidelines-virtual-class-destructor

查找其析构函数既不是公共且虚拟,也不是受保护且非虚拟的虚拟类。为了防止未定义的行为,应通过以下方式之一指定虚拟类的析构函数。

此检查实现来自 C++ 核心准则的 C.35

请注意,此检查将诊断具有虚拟方法的类,无论该类是否用作基类。

针对用户声明的和隐式析构函数,修复方法包括将其设为公共且非虚拟或受保护且虚拟。针对私有析构函数不提供修复方法。在这种情况中,是将它们设为私有且虚拟还是受保护且非虚拟,取决于用例,因此留给用户决定。

示例

例如,以下类/结构由于违反了准则 **C.35**,会被检查标记。

struct Foo {        // NOK, protected destructor should not be virtual
  virtual void f();
protected:
  virtual ~Foo(){}
};

class Bar {         // NOK, public destructor should be virtual
  virtual void f();
public:
  ~Bar(){}
};

这将被重写成如下形式

struct Foo {        // OK, destructor is not virtual anymore
  virtual void f();
protected:
  ~Foo(){}
};

class Bar {         // OK, destructor is now virtual
  virtual void f();
public:
  virtual ~Bar(){}
};