在C++中,虚析构函数和纯虚析构函数都与多态和继承相关。让我们分别看一下它们的作用,并使用具体的代码来说明。
- 虚析构函数:
虚析构函数用于在继承层次结构中正确释放资源。当基类指针指向派生类对象时,使用虚析构函数可以确保调用正确的析构函数,以避免资源泄漏。
#include <iostream>
class Base {
public:
virtual ~Base() {
std::cout << "Base destructor" << std::endl;
}
};
class Derived : public Base {
public:
~Derived() override {
std::cout << "Derived destructor" << std::endl;
}
};
int main() {
Base* obj = new Derived();
delete obj; // 调用Derived的析构函数,然后调用Base的析构函数
return 0;
}
在这个例子中,Base
类的析构函数被声明为虚析构函数。当我们使用Base
指针指向Derived
对象时,删除这个指针时会调用Derived
的析构函数,然后调用Base
的析构函数。
- 纯虚析构函数:
纯虚析构函数是一个纯虚函数,它没有实现,但是在基类中声明。纯虚析构函数的存在强制派生类提供它自己的析构函数的实现。
#include <iostream>
class AbstractBase {
public:
virtual ~AbstractBase() = 0; // 纯虚析构函数
virtual void someFunction() = 0;
};
AbstractBase::~AbstractBase() {
std::cout << "AbstractBase destructor" << std::endl;
}
class Derived : public AbstractBase {
public:
~Derived() override {
std::cout << "Derived destructor" << std::endl;
}
void someFunction() override {
std::cout << "Derived::someFunction()" << std::endl;
}
};
int main() {
AbstractBase* obj = new Derived();
obj->someFunction();
delete obj; // 调用Derived的析构函数,然后调用AbstractBase的析构函数
return 0;
}
在这个例子中,AbstractBase
类包含一个纯虚析构函数。Derived
类继承自AbstractBase
并提供了实际的析构函数实现。同样,当我们使用AbstractBase
指针指向Derived
对象时,删除指针时会调用Derived
的析构函数,然后调用AbstractBase
的析构函数。
纯虚析构函数的存在主要是为了表明这个类是一个抽象基类,不能被实例化。