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;
}
先调用派生类析构函数释放派生类资源,再调用基类析构函数。内存被完美释放