继承时,要养成的一个好习惯就是,基类析构函数中,加上virtual,为什么要加上呢?
看下未加virtual的代码执行结果:
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
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;
};
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
从以上对比结果来看,就非常清楚为什么一定要养成该好习惯了。防止继承的父类内存没有释放。一个良好的习惯可以规避很多难以发现的问题。