clang-tidy启用cppcoreguidelines规则时对含受保护默认析构函数的抽象基类派生类的警告问题咨询
clang-tidy启用cppcoreguidelines规则时对含受保护默认析构函数的抽象基类派生类的警告问题咨询
大家好,我最近在用clang-tidy做静态分析,并且启用了cpp-core-guidelines规则,碰到了一个让人困惑的警告问题,想请教下社区的各位大佬。
之前根据cpp-core-guidelines一位作者的建议,我设计了这样的类结构:一个抽象基类,所有成员函数都是纯虚的,析构函数设为protected且用默认实现;派生类标记了final,析构函数是public但非虚的。具体代码如下:
struct Base { public: // 所有函数都是纯虚函数 virtual void allFunctionsHereArePureVirtual() = 0; protected: ~Base() = default; }; // 这里final其实无关紧要,但cpp-core-guidelines还是报了警告!!! struct Derived final : Base { public: ~Derived(); // 实现细节无关紧要 void allFunctionsHereArePureVirtual() override; };
现在clang-tidy的cppcoreguidelines-virtual-class-destructor规则给我抛出了警告:
Destructor of 'Derived' is public and non-virtual (fix available)
我有点搞不懂的是,按这个设计,根本不可能通过Base指针多态删除Derived对象——编译器直接会报错阻止这种操作。那这个警告到底是哪里出了问题?是lint工具本身的判断失误,还是我对cpp-core-guidelines的理解有偏差?
另外我还在琢磨,会不会现在的准则有了更新,要求即使抽象基类的析构函数是protected的,也应该设为virtual?毕竟通过派生类删除对象时,基类析构函数的virtual属性可能会被编译器优化掉?
最后还有个实际的疑问:为了应付这类无法区分场景的lint工具(以及类似的编译器警告),是不是干脆把基类的析构函数设为protected且virtual会更省心,而不是去逐个选择性地屏蔽这些警告?
感谢大家的解答!
内容来源于stack exchange
相关产品推荐
相关产品推荐

