虚析构函数
虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对
象。
#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++中是合法的,但是在使用的时候有一个额外的限制:必须为纯
虚析构函数提供一个函数体。 那么问题是:如果给虚析构函数提供函数体了,那
怎么还能称作纯虚析构函数呢? 纯虚析构函数和非纯析构函数之间唯一的不同之
处在于纯虚析构函数使得基类是抽象类,不能创建基类的对象。