虚析构函数的用处
《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的学习之路 阅读(406) 评论(2) 编辑 收藏 举报