Virtual析构函数

Virtual析构函数

virtual析构函数确保在通过基类指针删除派生类对象时,能够正确调用派生类的析构函数,从而防止资源泄露

virtual析构函数的问题

当基类的析构函数不是 virtual时,通过基类指针delete对象,只会调用基类的析构函数,派生类的析构函数会被完全忽略

c++ 复制代码
#include <iostream>

class Base {
public:
    Base() { std::cout << "Base constructor\n"; }
    // 非虚析构函数
    ~Base() { std::cout << "Base destructor\n"; }
};

class Derived : public Base {
private:
    int* data_;
public:
    Derived() { 
        data_ = new int[100]; // 派生类申请了资源
        std::cout << "Derived constructor, allocated data\n";
    }
    ~Derived() {
        delete[] data_; // 派生类释放资源
        std::cout << "Derived destructor, freed data\n";
    }
};

int main() {
    Base* ptr = new Derived(); // 用基类指针指向派生类对象
    delete ptr;                // 通过基类指针删除
    return 0;
}

virtual析构函数的解决方案

在基类的析构函数前加上virtual关键字

c++ 复制代码
#include <iostream>

class Base {
public:
    Base() { std::cout << "Base constructor\n"; }
    // 虚析构函数
    virtual ~Base() { std::cout << "Base destructor\n"; }
};

// Derived类的代码保持不变
class Derived : public Base {
private:
    int* data_;
public:
    Derived() { 
        data_ = new int[100];
        std::cout << "Derived constructor, allocated data\n";
    }
    ~Derived() {
        delete[] data_;
        std::cout << "Derived destructor, freed data\n";
    }
};

int main() {
    Base* ptr = new Derived();
    delete ptr;
    return 0;
}

先调用派生类析构函数释放派生类资源,再调用基类析构函数。内存被完美释放


相关推荐
_F_y7 小时前
MySQL用C/C++连接
c语言·c++·mysql
兩尛7 小时前
c++知识点2
开发语言·c++
xiaoye-duck7 小时前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
Azure_withyou8 小时前
Visual Studio中try catch()还未执行,throw后便报错
c++·visual studio
琉染云月8 小时前
【C++入门练习软件推荐】Visual Studio下载与安装(以Visual Studio2026为例)
c++·visual studio
L_09079 小时前
【C++】高阶数据结构 -- 红黑树
数据结构·c++
智者知已应修善业13 小时前
【查找字符最大下标以*符号分割以**结束】2024-12-24
c语言·c++·经验分享·笔记·算法
91刘仁德13 小时前
c++类和对象(下)
c语言·jvm·c++·经验分享·笔记·算法
diediedei13 小时前
模板编译期类型检查
开发语言·c++·算法
mmz120714 小时前
分治算法(c++)
c++·算法