虚析构函数
虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对
象。
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base" << endl;
}
// virtual ~Base()
~Base()
{
cout << "~Base" << endl;
}
};
class Derived : public Base
{
public:
Derived()
{
cout << "Derived" << endl;
}
~Derived()
{
cout << "~Derived" << endl;
}
};
void test1()
{
Base *pb;
pb = new Derived;
delete pb;
}
int main()
{
test1();
system("pause");
return 0;
}
如果析构函数不加virtual,delete pb只会执行Base的析构函数,而不是真正的Derived析构函数。因为不是virtual函数,所以调用的函数依赖于指向静态类型,即Base。如下图所示。
virtual ~Base();
基类Base析构函数,加上virtual后,正调用子类的析构函数。
纯虚析构函数
纯虚析构函数在 c++中是合法的,但是在使用的时候有一个额外的限制:必须为纯
虚析构函数提供一个函数体。 那么问题是:如果给虚析构函数提供函数体了,那
怎么还能称作纯虚析构函数呢? 纯虚析构函数和非纯析构函数之间唯一的不同之
处在于纯虚析构函数使得基类是抽象类,不能创建基类的对象。