首先,我们需要明确什么是纯虚函数。纯虚函数是在基类中声明但不定义的虚函数,由派生类来定义。基类中的纯虚函数使该基类成为一个抽象基类,不能创建该类的对象,只能创建其派生类的对象。
纯虚析构函数同样是声明但不定义的虚析构函数。然而,有一个重要的区别:尽管纯虚析构函数是纯虚的,但仍然需要为其提供定义,这是因为,当派生类的对象被销毁时,基类的析构函数仍然会被调用。
以下是纯虚析构函数的一个例子:
#include
using namespace std;
class AbstractBase {
public:
// 构造函数
AbstractBase() {
cout << “AbstractBase Constructor!” << endl;
}
// 纯虚析构函数
virtual ~AbstractBase() = 0;
};
// 纯虚析构函数的定义
AbstractBase::~AbstractBase() {
cout << “AbstractBase Destructor!” << endl;
}
class Derived : public AbstractBase {
public:
Derived() {
cout << “Derived Constructor!” << endl;
}
~Derived() {cout << "Derived Destructor!" << endl;
}
};
int main() {
Derived obj;
// 当离开作用域时,先调用Derived的析构函数,再调用AbstractBase的析构函数
return 0;
}
输出为:
Copy code
AbstractBase Constructor!
Derived Constructor!
Derived Destructor!
AbstractBase Destructor!
区别总结:
纯虚析构函数:它使类成为抽象类,防止该类的实例化。尽管它是纯虚的,但还是需要定义。
普通虚析构函数:它允许在派生类中重写,确保基类指针指向派生类对象时,派生类的析构函数会被正确调用。也需要定义。
普通析构函数:没有virtual关键字的普通析构函数。如果基类指针指向派生类对象,并试图删除它,可能不会调用派生类的析构函数,导致资源泄露。
在上面的例子中,当Derived类的对象被销毁时,首先调用Derived类的析构函数,然后调用AbstractBase类的析构函数。这展示了虚析构函数的一个关键用途:确保当使用基类指针指向派生类对象时,析构函数的调用顺序是正确的。