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

来源:互联网 发布:win10仿linux主题 编辑:程序博客网 时间:2024/06/05 03:49
先举例:
#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,那就是资源泄露了。

 


0 0
原创粉丝点击