[C++]多态与虚析构函数

观察以下代码的输出

#include <iostream>

using namespace std;

class Base

{



public:

    Base()

    {

        cout<<"Base()"<<endl;

    }

    ~Base()

    {

        cout<<"~Base()"<<endl;

    }

};



class Derived:public Base

{

public:

    Derived()

    {

        cout<<"Derived()"<<endl;

    }

    ~Derived()

    {

        cout<<"~Derived()"<<endl;

    }

};



int main()

{

    Base *pBase;

    Derived derived;

    pBase = &derived;

    delete pBase;

    return 0;

}

[C++]多态与虚析构函数

  当使用delete pBase时,释放pBase所指的内存,而pBase所指的是Derived对象,为什么不会调用Derived的析构函数呢?这里由于是静态联编,pBase在编译时已经确定所指向的函数时Base的函数,而不会根据对象derived来确定指向的函数。如此一来如果Derived申请的内存资源,但是没有在它的析构函数中释放资源,造成内存泄露。

  为了改变这个,就出现了虚析构函数

  只要将基类的析构函数设为virtual型,则所有派生类都自动将析构函数设为virtual型,这样子就保证了不会因为析构函数未被调用而导致内存泄露。

#include <iostream>

using namespace std;

class Base

{



public:

    Base()

    {

        cout<<"Base()"<<endl;

    }

    virtual ~Base()

    {

        cout<<"~Base()"<<endl;

    }

};



class Derived:public Base

{

public:

    Derived()

    {

        cout<<"Derived()"<<endl;

    }

    ~Derived()

    {

        cout<<"~Derived()"<<endl;

    }

};



int main()

{

    Base *pBase;

    Derived derived;

    pBase = &derived;

    delete pBase;

    return 0;

}

[C++]多态与虚析构函数

 

  这样子才正确调用析构函数释放资源。


本文基于知识共享署名-非商业性使用 3.0 许可协议进行许可。欢迎转载、演绎,但是必须保留本文的署名林羽飞扬,若需咨询,请给我发信

你可能感兴趣的:(C++)