为什么析构函数一般写成虚函数

在C++中,当我们有一个指向基类的指针或引用,而它实际上指向的是一个派生类的对象时,如果我们通过这个指针或引用去删除这个对象,那么就会调用相应的析构函数来清理这个对象。

如果这个析构函数不是虚函数,那么就会调用基类的析构函数,而派生类的析构函数则不会被调用。这就可能导致资源泄漏,因为派生类的析构函数通常负责清理派生类特有的资源。

但是如果我们把基类的析构函数声明为虚函数,那么在删除对象时就会调用正确的析构函数。也就是说,如果我们通过一个指向基类的指针删除一个派生类的对象,那么就会先调用派生类的析构函数,然后再调用基类的析构函数。这样就能确保所有的资源都被正确地清理。

举个例子:

class Base {
public:
    virtual ~Base() {
        // 清理基类的资源
    }
};

class Derived : public Base {
public:
    ~Derived() {
        // 清理派生类的资源
    }
};

Base* obj = new Derived();
delete obj;  // 这会先调用Derived的析构函数,然后再调用Base的析构函数

因此,如果你的类是作为基类使用的(也就是说,你的类有可能被其他类继承),那么你应该让你的类的析构函数成为虚函数,以防止资源泄漏。

发表评论

后才能评论