Thursday, June 07, 2007

虚析构函数

虚析构函数

在析构函数前面加上关键字virtual进行说明,称该析构函数为虚析构函数。例如:

 

    class B

    {

        virtual ~B();

       

    };

 

    该类中的析构函数就是一个虚析构函数。

 

    如果一个基类的析构函数被说明为虚析构函数,则它的派生类中的析构函数也是虚析构函数,不管它是否使用了关键字virtual进行说明。

 

    说明虚析构函数的目的在于在使用delete运算符删除一个对象时,能保析构函数被正确地执行。因为设置虚析构函数后,可以采用动态联编方式选择析构函数。

 

    下面举一个用虚析构函数的例子。

 

    #include <iostream.h>

 

    class A

    {

    public:

    virtual ~A() { cout<<"A::~A() Called.\n"; }

    };

 

    class B : public A

    {

    public:

    B(int i) { buf = new char[i]; }

    virtual ~B()

    {

        delete [] buf;

        cout<<"B::~B() Called.\n";

    }

    private:

    char * buf;

    };

 

    void fun(A *a)

    {

    delete a;

    }

 

    void main()

    {

    A *a = new B(15);

    fun(a);

    }

 

    执行该程序输出如下结果:

 

    B::~B() Called.

    A::~A() Called.

 

    如果类A中的析构函数不用虚函数,则输出结果如下:

 

    A::~A() Called.

 

    当说明基类的析构函数是虚函数时,调用fun(a)函数,执行下述语句:

 

    delete a;

 

    由于执行delete语句时自动调用析构函数,采用动态联编,调用它基类的析构函数,所以输出上述结果。

 

    当不说明基类的析构函数为虚函数时,delete隐含着对析构函数的调用,故产生

 

    A::~A() Called.

 

    的结果。

No comments: