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;
}

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


相关推荐
神仙别闹1 小时前
基于QT(C++)实现(图形界面)选课管理系统
java·c++·qt
NicolasCage1 小时前
C语言指针Pointers
c++·后端
「QT(C++)开发工程师」1 小时前
Qt C++动态库SDK在Visual Studio 2022使用(C++/C#版本)
c++·qt·c#·visual studio
weixin_537590452 小时前
【任务6.13】计算肇事汽车号码
c++·算法·汽车
两颗泡腾片3 小时前
黑马程序员C++核心编程笔记--类和对象--运算符重载
c++·笔记
用户686916134903 小时前
1999年NOIP普及组旅行家的预算(洛谷P1016):贪心算法实战指南
c++
程序员编程指南3 小时前
Qt 与 WebService 交互开发
c语言·开发语言·c++·qt·交互
溟洵4 小时前
Qt 窗口 工具栏QToolBar、状态栏StatusBar
开发语言·前端·数据库·c++·后端·qt
铭哥的编程日记4 小时前
《C++ list 完全指南:list的模拟实现》
c++
程序员编程指南4 小时前
Qt 远程过程调用(RPC)实现方案
c语言·c++·qt·rpc·系统架构