You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 11:38:06