为什么C++基类析构函数写成虚函数
来源:互联网 发布:php artisan optimize 编辑:程序博客网 时间:2024/06/16 07:13
下面的代码举例:
// virtual.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <string.h>
#define MAXLEN 128
class CEmployee{
public:
int m_ID;
char m_Name[MAXLEN];
char m_Depart[MAXLEN];
CEmployee(){
printf("CEmployee 类构造函数被调用了/n");
}
~CEmployee(){
printf("CEmployee 类析构函数被调用了/n");
getchar();
}
protected:
private:
};
class COperator:public CEmployee{
public:
char m_Password[MAXLEN];
COperator(){
strcpy(m_Name,"MR");
printf("COperator 子类的构造函数被调用了/n");
getchar();
}
~COperator(){
printf("COperator 子类析构函数被调用/n");
getchar();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CEmployee *oper = new COperator() ;
delete oper;
return 0;
}
函数的返回结果是:
可以看到值调用了父类的析构函数,而子类的析构函数没有被调用,那么可想而知,如果在子类的构造函数中对某个成员函数在堆空间中分配了空间,而之类没有被调用,是不是会造成内存泄漏呢?答案是肯定的,那有什么办法可以解决这种情况下出现的内存泄漏呢?那就是把父类的析构函数写为虚函数,看下面的代码:
// virtual.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string.h>
#define MAXLEN 128
class CEmployee{
public:
int m_ID;
char m_Name[MAXLEN];
char m_Depart[MAXLEN];
CEmployee(){
printf("CEmployee 类构造函数被调用了/n");
}
virtual ~CEmployee(){
printf("CEmployee 类析构函数被调用了/n");
getchar();
}
protected:
private:
};
class COperator:public CEmployee{
public:
char m_Password[MAXLEN];
COperator(){
strcpy(m_Name,"MR");
printf("COperator 子类的构造函数被调用了/n");
getchar();
}
~COperator(){
printf("COperator 子类析构函数被调用/n");
getchar();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CEmployee *oper = new COperator() ;
delete oper;
return 0;
}
运行结果:
因此,在写父类的时候,最好将其析构函数写为虚函数。这样可以防止比较瘾避的内存泄漏。
- 为什么C++基类析构函数写成虚函数
- C++:析构函数写成虚函数是干什么用的,为什么要这么写?
- 析构函数为什么要写成虚函数
- C++中析构函数为什么要写成虚函数
- C++中析构函数为什么有时候写成虚拟的
- 【C++】基类析构函数为什么要为虚函数
- 为什么要将一个父类的析构函数写成一个虚函数,和内存泄漏有关,怎么理解?
- 析构函数为什么一定写成虚函数的形式 http://blog.sina.com.cn/s/blog_4b146a9c0100sgyg.html
- 为什么要将一个父类的析构函数写成一个虚函数,和内存泄漏有关,怎么理解?
- c++中基类写成虚函数的作用
- C ++为什么经常将析构函数声明为虚函数?
- 【c++】构造函数为什么不能是虚函数
- 【c++】cout重载能不能写成成员函数,若能,写出函数原型,若不能,说明原因
- 为什么C 没有嵌套函数?
- 为什么使用虚函数
- GetMessage函数 第二个 写成了hwnd
- 类中不写成员函数易犯错误
- 把类的析构函数写成虚函数的用意
- 微信学习资源
- uva120--模拟
- zoj2172
- Code Forces 559 A. Gerald's Hexagon(水~)
- 如何使用 git 忽略掉已经被 git 管理的文件
- 为什么C++基类析构函数写成虚函数
- 面试题19_二叉树的镜像——剑指offer系列
- Unity3D 学习入门
- JS获取随机颜色函数
- Switch case的应用
- 博洛尼亚中文离线地图App上线
- Sliding Window Maximum
- setTimeout用法:利用setTimeout在页面上不停的显示当前日期时间
- HDU 1907 John