修复基类A虚析构后,Clang-Tidy未检测子类B缺失虚析构的问题咨询
问题:修复基类虚析构函数后,Clang-Tidy未检测子类的非虚析构函数警告
最小可复现示例(MWE)
初始代码(reference.cpp)
#include <iostream> class A { public: virtual void foo() = 0; }; class B : public A { public: void foo() override { std::cout << "test"; } };
执行Clang-Tidy命令
clang-tidy -checks="cppcoreguidelines-virtual-class-destructor" ./reference.cpp --
首次执行输出
42 warnings generated. /workspace/test/reference.cpp:3:7: warning: destructor of 'A' is public and non-virtual [cppcoreguidelines-virtual-class-destructor] class A { ^ /workspace/test/reference.cpp:3:7: note: make it public and virtual class A { ^ /workspace/test/reference.cpp:8:7: warning: destructor of 'B' is public and non-virtual [cppcoreguidelines-virtual-class-destructor] class B : public A { ^ /workspace/test/reference.cpp:8:7: note: make it public and virtual class B : public A { ^ Suppressed 40 warnings (40 in non-user code).
修复基类后的代码
#include <iostream> class A { public: virtual void foo() = 0; virtual ~A() = default; }; class B : public A { public: void foo() override { std::cout << "test"; } };
再次执行Clang-Tidy的输出
40 warnings generated. Suppressed 40 warnings (40 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
问题说明
修复基类A的虚析构函数后,子类B仍未显式定义虚析构函数,但Clang-Tidy不再触发警告,如何让工具检测出子类B的这个情况?
环境信息
clang-tidy --version LLVM (http://llvm.org/): LLVM version 14.0.5 Optimized build. Default target: x86_64-redhat-linux-gnu Host CPU: skylake
解决方案
这是C++标准和Clang-Tidy检查规则共同作用的结果:
- 当基类拥有虚析构函数时,子类的析构函数会自动隐式成为虚函数,无需显式声明
virtual关键字,完全符合多态类的内存安全要求。 - Clang-Tidy的
cppcoreguidelines-virtual-class-destructor检查仅针对两类问题:一是本身包含虚函数但无虚析构函数的类;二是继承自无虚析构函数的多态类的子类。修复基类后,子类B的隐式虚析构函数已经满足规范,因此工具不会触发警告。
如果是出于代码风格要求需要显式声明子类的虚析构函数,可手动添加virtual ~B() = default;,但这并非语法或安全层面的强制要求。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

