虚析构函数的用处

《EFFECTIVE C++》条款14:确定基类有虚析构函数

“当通过基类的指针去删除派生类的对象,而积累又没有虚析构函数时,结果将是不可确定的”。通常发生的情况是:派生类的析构函数永远不会被调用。

派生类的构造函数应在初始化表里调用基类的构造函数;
派生类和基类的析构函数应加Virtual关键字。(以正确地根据多态性调用析构函数)
不要小看构造函数和析构函数,其实编起来还是不容易。

// virtual destructor.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

#include <iostream>

 

using namespace std;

 

//////////////////////////////////////////////////////////////////////////

class Base

{

public:

   ~Base() { cout<< "~Base" << endl ; }

};

 

class Derived : public Base

{

public:

   ~Derived() { cout<< "~Derived" << endl ; }

};

//////////////////////////////////////////////////////////////////////////

class virtualBase

{

public:

virtual ~virtualBase() { cout<< "~virtualBase" << endl ; }

};

 

class virtualDerived : public virtualBase

{

public:

virtual ~virtualDerived() { cout<< "~virtualDerived" << endl ; }

};

 

int _tmain(int argc, _TCHAR* argv[])

{

   cout<<"upcast, without virtual destructor:"<<endl<<endl;

   Base * pB = new Derived; // upcast

   delete pB;

   cout<<endl<<endl<<"upcast, with virtual destructor:"<<endl<<endl;

   virtualBase * pvB = new virtualDerived; // upcast

   delete pvB;

 

   getchar();

}

 

////////////////// 输出结果://////////////////////////////////////

/*

 

upcast, without virtual destructor:

~Base

 

upcast, with virtual destructor:

~virtualDerived

~virtualBase

  

*/

//////////////////////////////////////////////////////////////////////////

posted on 2009-05-08 07:10  TobyLin的学习之路  阅读(404)  评论(2编辑  收藏  举报

导航