虚析构函数[转]

 
古城
@ 2007.11.11
分类:技术笔记
点击:2172  评论:0
 
 
 
    在析构函数前面加上关键字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.

    的结果。
 
 
 
 
 

本文评论

 
 

发表评论

你的评论
← 填你的昵称
以下内容非必填,可根据需要填写
← 可以展示在你的评论上方
← 不会在页面展示
← 不会在页面展示
← 只给我看?勾选上
这是一个别人称之为角落的世界
幸而,它的确是我的世界