虚析构函数

来源:互联网 发布:apache启动和停止命令 编辑:程序博客网 时间:2024/06/06 04:22

虚析构函数

@(C++实践)

很多书里都有说过,要把基类的析构函数声明为virtual,那么为什么呢?
看下面这个例子:

class Base{public:    Base(){        std::cout << "Base::Base()" <<  std::endl;    }    ~Base(){        std::cout << "Base::~Base()" <<  std::endl;    }    virtual void fun()    {        std::cout << "Base::fun()" <<  std::endl;    }};class Derived : public Base                              {                                                        public:                                                      Derived()                                                {                                                            std::cout << "Derived::Derived()" <<  std::endl;     }                                                        ~Derived(){                                                  std::cout << "Derived::~Derived()" <<  std::endl;    }                                                        void fun()                                               {                                                            std::cout << "Derived::fun()" <<  std::endl;         }                                                    };  int main(int argc, const char* argv[]) {                                          Base* pb = new Base();                 Base* pd = new Derived();              pb->fun();                             pd->fun();                             delete pb;                             delete pd;                             return 0;                          }                                                     

程序看似没有什么问题,new的指针都delete掉了,但是执行起来:

Base::Base()Base::Base()Derived::Derived()Base::fun()Derived::fun()Base::~Base()Base::~Base()

怎么delete pd这个指针只调用了基类的析构函数啊。这岂不是个天坑。
对此只要把基类的析构函数声明为virtual即可,看下虚析构函数下的输出结果:

Base::Base()Base::Base()Derived::Derived()Base::fun()Derived::fun()Base::~Base()Derived::~Derived()Base::~Base()

delete pd的时候,它很机智的先执行了派生类的析构函数,然后执行了基类的析构函数。

原创粉丝点击