You need to enable JavaScript to run this app. C++中基类析构函数为virtual时派生类析构函数是否默认为virtual?
优惠活动
大模型
产品
解决方案
定价
更多

C++中基类析构函数为virtual时派生类析构函数是否默认为virtual?

关于派生类析构函数是否默认为virtual的解答

结论

只要基类的析构函数被声明为virtual,派生类的析构函数默认隐式为virtual,你对规则的延伸理解是正确的,普通虚函数的隐式virtual规则完全适用于析构函数场景。

规则解释

C标准对虚函数重写有明确规定:如果基类的某个成员函数被声明为virtual,那么派生类中签名匹配的重写函数,即便不主动添加virtual关键字,也会自动具备虚函数属性。
析构函数属于特殊的重写场景:虽然派生类析构函数的名称和基类析构函数名称看起来不匹配,但C
专门对析构函数的重写做了额外约定,只要基类析构是virtual,不管派生类是显式自定义析构、还是使用编译器默认生成的析构,都自动属于虚函数。

针对你给出的代码验证

你提供的示例代码:

class Base
{
public:
    virtual ~Base() // note: virtual
    {
        std::cout << "Calling ~Base()\n";
    }
};
 
class Derived: public Base
{
 
public:
 
    ~Derived() 
    {
        std::cout << "Calling ~Derived()\n";
    }
};

其中Derived类的析构函数已经是隐式虚函数,此时执行如下多态调用:

Base* ptr = new Derived();
delete ptr;

输出顺序为:

Calling ~Derived()
Calling ~Base()

完全符合多态析构的预期,不会出现派生类资源泄漏的问题。

补充说明

只有当基类析构函数本身不是virtual时,派生类的析构函数才不会默认是virtual,这种情况下用基类指针指向派生类对象后执行delete,属于未定义行为,通常只会调用基类析构函数,导致派生类申请的资源无法释放。

内容的提问来源于stack exchange,提问作者Karen Baghdasaryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 01:24:08