基类中如果定义了虚函数,则基类中析构函数也应该声明为虚函数,这样在派生类中才能正常的构造与析构,对内存的回收才准确:
构造基类------>构造子类------>析构子类------>析构基类
看下面这个程序(调用类B的成员函数get()),用来查看程序执行过程:
#include <iostream>
using namespace std;基类A成员函数中只有get()声明为虚函数
class A
{
public:
A(){cout<<"调用基类的构造函数\n";}
virtual void get(){cout<<"a\n";}
~A(){cout<<"调用基类的析构函数\n";}
};
class B:public A
{
public:
B(){cout<<"调用子类的构造函数\n";}
void get(){cout<<"b\n";}
~B(){cout<<"调用子类的析构函数\n";}
};
int main()
{
A *p = new B;
p->get();
delete p;
return 0;
}
程序执行结果如下:
输出结果可以看出并没有析构子类的析构函数!
将如上程序基类的析构函数前加上virtual:virtual ~A(){};定义为虚析构函数,则输出结果如下图: