为什么析构函数一般写成虚函数
在C++中,当我们有一个指向基类的指针或引用,而它实际上指向的是一个派生类的对象时,如果我们通过这个指针或引用去删除这个对象,那么就会调用相应的析构函数来清理这个对象。
如果这个析构函数不是虚函数,那么就会调用基类的析构函数,而派生类的析构函数则不会被调用。这就可能导致资源泄漏,因为派生类的析构函数通常负责清理派生类特有的资源。
但是如果我们把基类的析构函数声明为虚函数,那么在删除对象时就会调用正确的析构函数。也就是说,如果我们通过一个指向基类的指针删除一个派生类的对象,那么就会先调用派生类的析构函数,然后再调用基类的析构函数。这样就能确保所有的资源都被正确地清理。
举个例子:
class Base {
public:
virtual ~Base() {
// 清理基类的资源
}
};
class Derived : public Base {
public:
~Derived() {
// 清理派生类的资源
}
};
Base* obj = new Derived();
delete obj; // 这会先调用Derived的析构函数,然后再调用Base的析构函数
因此,如果你的类是作为基类使用的(也就是说,你的类有可能被其他类继承),那么你应该让你的类的析构函数成为虚函数,以防止资源泄漏。