您的位置:首页 > 编程语言 > C语言/C++

C++析构函数必须要用virtual修饰的原因

2017-01-11 15:41 155 查看
先举例:
#include <iostream>

using namespace std;

class Father

{

public:

    int m_fMember;

    Father(){m_fMember=1;}

    ~Father(){cout<<m_fMember<<endl;}

};

class Child : public Father{

public:

    int m_cMember;

    Child(){m_cMember=2;}

    ~Child(){cout<<m_cMember<<endl;}

};

int main(int argc, char** argv)

{

    Father* pObj1 = new Child();

    delete pObj1;

    cout<<"--"<<endl;

    Child* pObj2 = new Child();

    delete pObj2; 

    return 0;


运行结果:

1

--

2

1

如果不用virtual函数,是没有执行期绑定一说的,比如pObj1这个指针,其实它是Child对象,但是在释放时,~Child()方法并没有被调用,仅调用了~Father方法。为什么呢?因为没有用virtual,就是编译期绑定,当你在编译时gcc/g++只知道pObj1是个Father对象,所以在delete时就去调用Father的析构了。

而如果定义成virtual ~Father时,结果就是一定会析构Child,这就是为什么析构函数都要用virtual,因为没人知道会不会有子类继承,否则一旦继承,发生这样的事,析构函数里万一释放了些资源,比如SOCKET,比如memory,那就是资源泄露了。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: