继承基类析构函数一定要加上virtual

2014-11-24 02:37:38 · 作者: · 浏览: 1
继承时,要养成的一个好习惯就是,基类析构函数中,加上virtual,为什么要加上呢
看下未加virtual的代码执行结果:
[cpp]
#include "stdafx.h"
#include
#include
#include
#include
#include
using namespace std;
class CTask
{
public:
CTask() { }
~CTask() { }
virtual void process()
{
printf ("Task is running\n");
}
private:
};
//
class CSpecialTask : public CTask
{
public:
CSpecialTask()
{
}
~CSpecialTask()
{
printf("release memory\n");
delete m_task_no;
}
void process()
{
m_task_no = new int();
*m_task_no = 1;
printf ("Special Task %d is running\n",*m_task_no);
}
private:
int* m_task_no;
};
[cpp]
[cpp]

int main (int argc, char **argv)

{
CTask* task = new CSpecialTask();

task->process();

delete task;
task = NULL;
return 0;
}

输出结果为:
Specail Task 1 is running。
~CTask() 析构函数前加上virtual关键字之后重新执行一遍,结果为:
Specail Task 1 is running。
release memory
从以上对比结果来看,就非常清楚为什么一定要养成该好习惯了。防止继承的父类内存没有释放。一个良好的习惯可以规避很多难以发现的问题。