我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明: 代码 的输出结果是: 这个很简单,非常好理解。 也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
有下面的两个类:
{
public:
ClxBase() {};
virtual ~ClxBase() {};
virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};
class ClxDerived : public ClxBase
{
public:
ClxDerived() {};
~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };
void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};
pTest->DoSomething();
delete pTest;
Output from the destructor of class ClxDerived!
但是,如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:
所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。
发表评论
-
hash的应用
2012-08-31 23:02 925第一部分为一道百度面试题Top K算法的详解;第二部分为关 ... -
微软智力题
2012-08-29 19:59 542第一组1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有 ... -
C++不能被继承的类
2012-08-27 20:16 1000一个类不能被继承, ... -
括号对齐问题
2012-08-27 10:47 1354解法一:左右括号成一对则抵消 可以 ... -
树的遍历
2012-08-19 10:43 682/****************************** ... -
堆排序
2012-08-16 14:24 846堆:(二叉)堆数据结构是一种数组对象。它可以被视为一棵完全 ... -
多态赋值
2012-08-14 16:16 780#include <iostream> usi ... -
static变量与static函数(转)
2012-08-13 10:15 705一、 static 变量 static变量大致分为三种用法 ... -
不用sizeof判断16位32位
2012-08-10 15:21 1665用C++写个程序,如何判断一个操作系统是16位还是3 ... -
找出连续最长的数字串(百度面试)
2012-08-09 15:15 1112int maxContinuNum(const char*in ... -
顺序栈和链栈
2012-08-06 10:01 769顺序栈:话不多说直接上代码 #include ... -
队列的数组实现和链表实现
2012-08-05 16:20 995话不多少,数组实现上代码: #include<i ... -
KMP算法详解
2012-08-02 21:40 853KMP算法: 是在一个“主文本字符串” ... -
字符串的最长连续重复子串
2012-08-01 15:05 9708两种方法: 循环两次寻找最长的子串: <方法一> ... -
寻找一个字符串连续出现最多的子串的方法(转)
2012-07-31 21:19 924算法描述首先获得后缀数组,然后1.第一行第一个字符a,与第二行 ... -
字符串的循环移位
2012-07-31 16:52 938假设字符串:abcdefg 左循环两位:cdefgab 右 ... -
一次谷歌面试趣事(转)
2012-07-31 15:26 732很多年前我进入硅谷 ... -
约瑟夫环问题(循环链表)
2012-07-30 21:31 1244题目描述:n只猴子要选大王,选举方法如下:所有猴子按 1, ... -
面试之单链表
2012-07-30 20:18 6941、编程实现一个单链表的建立/测长/打印。 ... -
多重继承内存地址问题
2012-07-30 15:55 697[cpp] view plaincopy ...
相关推荐
本文给大家分享了避免析构函数调用虚函数。
构造函数不能声明为虚函数,析构函数可以声明为虚函数。
虚析构函数示例 c++析构函数是否是虚函数时的差别,敬请留意
该资源的内容主要是 虚基类 虚函数成员 虚析构函数的具体的区别
我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:
C++中析构函数定义成虚函数的原因 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/SearchLife/archive/2009/03/12/3985341.aspx
C++中基类的析构函数为什么要用virtual虚析构函数.pdf
详细解释了为什么析构函数可以是虚函数,而构造函数不能是虚函数
c++ virtual 虚析构函数及虚函数的详细例子.rar
C++析构函数使用virtual的原因
1、原因: 在实现多态时, 当用基类指针操作派生类, 在析构时候防止只析构基类而不析构派生类。 2、例子: (1)、 #include using namespace std; class Base{ public: Base() {}; ~Base() {...
C++箴言:避免析构函数调用虚函数[归类].pdf
分类: 虚析构函数 析构函数的工作方式是:底层的派生类(most derived class)的析构函数先被调用,然后调用每一个基类的析构函数。... 但是,一般如果不做基类的类的析构函数一般不声明为
自己下的一个调用派生析构函数的程序,希望大家互相学习啊。
定义析构函数格式为: ~类名() {…} 由于c#得到自动内存管理的支持,当对象生命期结束后,系统能够自动回收那些对象应该释放的资源等,所以一般不需要程序员的关心,对于一般的对象,程序中不需要定义析构函数...
//析构函数做成员函数 }; Base::~Base()//成员函数实现 { cout; } class Derived:public Base { public: Derived(); ~Derived(); private: int *p; }; Derived::Derived() { p=new int(0);//从堆上分配一个int型...
C_虚构造函数和虚析构函数.pdf
c++中,如果没有为一个类提供析构函数,那么编译器会为这个类提供默认的析构的函数。由于析构函数的功能和构造函数相反,因此和默认的构造函数类似,编译器也会提供无用的默认的析构函数,和非无用的析构函数。两者...
本文给大家介绍了C++中确定基类有虚析构函数的方法。
主要介绍了C++中虚析构函数的作用及其原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧