我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:
有下面的两个类:
classClxBase
{
public:
ClxBase(){};
virtual~ClxBase(){};
virtualvoidDoSomething(){cout<<"DosomethinginclassClxBase!"<<endl;};
};
classClxDerived:publicClxBase
{
public:
ClxDerived(){};
~ClxDerived(){cout<<"OutputfromthedestructorofclassClxDerived!"<<endl;};
voidDoSomething(){cout<<"DosomethinginclassClxDerived!"<<endl;};
};
代码
ClxBase*pTest=newClxDerived;
pTest->DoSomething();
deletepTest;
的输出结果是:
Do something in class ClxDerived!
Output from the destructor of class ClxDerived!
这个很简单,非常好理解。
但是,如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:
Do something in class ClxDerived!
也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。
分享到:
相关推荐
虚析构函数示例 c++析构函数是否是虚函数时的差别,敬请留意
C++中基类的析构函数为什么要用virtual虚析构函数.pdf
本篇文章是对C++中虚析构函数的作用进行了详细的分析介绍,需要的朋友参考下
C++中析构函数定义成虚函数的原因 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/SearchLife/archive/2009/03/12/3985341.aspx
主要介绍了C++中虚析构函数的作用及其原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
c++ virtual 虚析构函数及虚函数的详细例子.rar
本文给大家分享了避免析构函数调用虚函数。
C++析构函数使用virtual的原因
虚析构函数 析构函数的工作方式是:底层的派生类(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++中确定基类有虚析构函数的方法。
c++中,如果没有为一个类提供析构函数,那么编译器会为这个类提供默认的析构的函数。由于析构函数的功能和构造函数相反,因此和默认的构造函数类似,编译器也会提供无用的默认的析构函数,和非无用的析构函数。两者...
1、原因: 在实现多态时, 当用基类指针操作派生类, 在析构时候防止只析构基类而不析构派生类。 2、例子: (1)、 #include using namespace std; class Base{ public: Base() {};...
析构函数的作用是当对象生命期结束后,收回对象占用的资源,析构函数的特点是: 1、析构函数名是在类名前加以符号“~”。 2、析构函数没有参数、返回类型和修饰符。 3、一个类中至多有一个析构函数,如果程序员...
在C++中,不能声明虚构造函数,但可以声明虚析构函数。多态性是指不同的对象对同一消息有不同的行为特性。虚函数作为运行时多态性的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有...
C++箴言:避免析构函数调用虚函数[归类].pdf