深入理解C++ 析构函数<四>虚析构函数

虚析构函数是什么?

虚析构函数 就是在基类中声明为 virtual 的析构函数:

cpp

复制代码
class Base {
public:
    virtual ~Base() = default;
};

它的核心作用是:

当通过基类指针 删除一个派生类对象时,能够正确调用派生类的析构函数,然后再调用基类的析构函数。

如果基类析构函数不是虚函数,那么:

cpp

复制代码
Base* p = new Derived;
delete p;

这是未定义行为 。很多情况下只会调用 Base::~Base(),而不会调用 Derived::~Derived(),导致派生类资源泄漏。

cpp 复制代码
#include <iostream>

class Base {
public:
    Base() {
        std::cout << "Base 构造\n";
    }

    virtual ~Base() {
        std::cout << "Base 析构\n";
    }
};

class Derived : public Base {
public:
    Derived() {
        data = new int[10];
        std::cout << "Derived 构造,申请资源\n";
    }

    ~Derived() override {
        delete[] data;
        std::cout << "Derived 析构,释放资源\n";
    }

private:
    int* data = nullptr;
};

int main() {
    std::cout << "创建 Derived 对象,用 Base* 保存\n";

    Base* p = new Derived;

    std::cout << "通过 Base* 删除对象\n";
    delete p;

    std::cout << "程序结束\n";
    return 0;
}
相关推荐
技术小甜甜12 分钟前
【Cursor】Skill 被标黄色警告,怎么改成合格的 SKILL.md
开发语言·javascript·ai编程·cursor·1024程序员节·ai agent·skills
qz_Serene17 分钟前
练习算法题:双指针 -cpp
c++·算法·leetcode·1024程序员节
扶尔魔ocy36 分钟前
【C++开发】从裸指针到智能指针
c++·智能指针·1024程序员节
小小龙学IT1 小时前
Python Polars 高性能数据处理引擎深度解析
开发语言·python·rust·1024程序员节
quantdash_cc1 小时前
如何利用标的信息为研究股票池补充名称和交易所信息?
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
CRMEB系统商城2 小时前
家电零售的供应商协同与物流提效
java·开发语言·人工智能·小程序·1024程序员节
王大师王文峰2 小时前
Java+AI 面试题(二):业务场景设计 10 例【客服机器人、合同审查、Text2SQL、告警降噪、成本优化】场景题答法与追问链路
java·开发语言·人工智能
言乐62 小时前
Python实现三轴联动根据数据自动打磨镜片模型
开发语言·python
CHHH_HHH3 小时前
【Linux网络篇】初识网络与Socket编程基础
linux·服务器·c语言·开发语言·网络·后端·1024程序员节
思麟呀3 小时前
BTree的原理与 C++ 完整实现
c语言·数据结构·c++·算法·1024程序员节