1957

无聊蛋疼的1957写的低端博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

有继承的C++析构函数一定要用virtual

Posted on 2012-10-23 09:41  1957  阅读(5021)  评论(2编辑  收藏  举报

先补下virtual是啥

虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。 

 

先贴个代码,再解释

#include <iostream>

using namespace std;

class Base
{
public:
    Base(){cout<<"Base Construct"<<endl;};
    ~Base(){cout<<"Base destroy"<<endl;}
       
};

class A : public Base
{
public:
    A(){cout<<"A Construct"<<endl;}
    ~A(){cout<<"A destroy"<<endl;}
};
class Base1
{
public:
    Base1(){cout<<"Base1 Construct"<<endl;};
    virtual  ~Base1(){cout<<"Base1 destroy"<<endl;}
       
};

class A1 : public Base1
{
public:
    A1(){cout<<"A1 Construct"<<endl;}
    ~A1(){cout<<"A1 destroy"<<endl;}
};

int main()
{
    Base* p = new A;
    delete p;
    cout<<"======================"<<endl;
    Base1* p1 = new A1;
    delete p1;
    return 0;
}
/*
  Base Construct
  A Construct
  Base destroy
  ======================
  Base1 Construct
  A1 Construct
  A1 destroy
  Base1 destroy
*/

在代码尾部的注释就是输出。

Base的析构函数没有virtual

Base1的析构函数有virtual

 

Base* p = new A

delete p

这个过程只调用了Base的析构函数,没有调用A的析构函数。

这样在实际应用中会有不确定的后果,可能会memory leak

应该在A的析构函数中我们可能会销毁一些其他的资源,而这里并未调用。

所以要给Base的析构函数以virtual属性。