C++编程总结之虚函数的使用
来源:互联网 发布:杀蚊软件 编辑:程序博客网 时间:2024/06/10 08:05
对于一个单一的类来说,析构函数是不是虚函数,其没有实质性的意义。但是当当前类作为基类的时候,基类的析构函数是不是虚函数则会对程序带来不同程度的影响。
看下下面的代码运行结果:
#include<iostream>using namespace std;class Base{public:Base(){cout << "Base:Constructor" <<endl;}~Base(){cout << "Base:Destructor" << endl;}};class DerivedA:public Base{public:DerivedA(){cout << "DerivedA:Constructor" <<endl;}~DerivedA(){cout << "DerivedA:Destructor" << endl;}};class DerivedB:public DerivedA{public:DerivedB(){cout << "DerivedB:Constructor" <<endl;}~DerivedB(){cout << "DerivedB:Destructor" <<endl;}};int main(){Base* tmp = new DerivedA();delete tmp;return 0;}
运行结果大家估计看的出来,当析构函数为非虚函数时,delete tmp的时候,只去调用了基类的析构函数,并没有调用派生类的析构函数。
下面基类的析构函数使用需虚析构试试看结果如何:
#include<iostream>using namespace std;class Base{public:Base(){cout << "Base:Constructor" <<endl;}virtual ~Base(){cout << "Base:Destructor" << endl;}};class DerivedA:public Base{public:DerivedA(){cout << "DerivedA:Constructor" <<endl;}~DerivedA(){cout << "DerivedA:Destructor" << endl;}};class DerivedB:public DerivedA{public:DerivedB(){cout << "DerivedB:Constructor" <<endl;}~DerivedB(){cout << "DerivedB:Destructor" <<endl;}};int main(){Base* tmp = new DerivedA();delete tmp;return 0;}
运行结果为:
这个时候,函数调用delete tmp的时候,先调用了派生类的析构函数,然后调用了基类的析构函数。
通常情况下,一个类的析构函数中,总是去处理一些需要释放内存资源的工作,而当析构函数没有被正确调用的时候,那么可能会造成本该释放的内存在程序结束的时候不被释放,从而造成内存的泄露。当数据量大的时候可能会造成很大的损失。并且对于一个C++程序员,时刻保证程序不出现内存泄露,使我们必须时刻注意的问题。
综上所述,当我们需要把当前类作为基类使用的时候,我们必须注意析构函数虚化的处理。当然当不做基类的时候,我们可以不去设置虚析构。
2 0
- C++编程总结之虚函数的使用
- linux c之assert函数使用总结
- C/C++函数指针总结之二:C函数指针的使用.
- linux C编程之基本的函数
- UNIX C 编程 ---- atexit函数的使用
- C中的getchar()函数的使用总结
- C中的getchar()函数的使用总结
- C中的getchar()函数的使用总结
- linux下c编程系统调用之有名管道FIFO函数的使用及案例
- linux C编程之gcc的使用
- C库函数使用与总结之时间函数
- C库函数使用与总结之字符串处理函数
- linux c之使用#define定义多行函数总结
- C的xml编程-libxml2(函数总结篇)
- 编程c++dll , DLL 的编写,导出函数 ,使用函数
- C/C++:友元函数以及友元类的使用总结
- C语言之动态函数的使用
- C语言之递归函数的使用
- java按照map的value排序
- IE, FireFox, Opera 浏览器支持CSS实现Alpha透明的方法 兼容问题
- c++模板元编程学习笔记(三)——习题4-2.逻辑元函数
- mysql 忘记密码之后 发生的神奇的事
- 子表JS插件技术
- C++编程总结之虚函数的使用
- 2014 Winter Vacation Practice No.2 Translation
- JavaScript生成GUID的算法
- 不允许创建临时变量,交换两个数的内容
- first
- 【java笔记】java多态性的例子
- 12-21日 刘阳阳
- UVA 113 --- Power of Cryptography 【double避开高精度】
- pc 上winscp 连接本地centos虚拟机