C++多态为什么要定义虚析构函数

来源:互联网 发布:外国人来中国旅游数据 编辑:程序博客网 时间:2024/06/06 02:00

请看父类Base类没有定义虚析构函数的例子:

#include <iostream>class Base{public:virtual int start(){std::cout<<"Base::start"<<std::endl;}~Base(){std::cout<<"Base::~Base() "<<std::endl;}};class Derived : public Base{public:    virtualint start(){m_pInt = new int [10];std::cout<<"Derived::start()"<<std::endl;}~Derived(){std::cout<<"Derived::~Derived()"<<std::endl;if(NULL != m_pInt){delete m_pInt;m_pInt = NULL;}}private:int *m_pInt;};int main(){Base *pBase = new Derived();pBase->start();delete pBase;pBase = NULL;return 0;}


执行结果



对不起,使用基类指向派生类,释放类对象时,没有执行到Derived类的析构函数,使得Derived类申请有堆内存或者申请有资源的情况,会造成内存泄漏或资源泄漏。

 

 

解决方法:  基类的析构函数定义为虚析构函数,这样的使用基类指向派生类,删除基类指针时,能执行到Derived类的析构函数。

#include <iostream>class Base{public:virtual int start(){std::cout<<"Base::start"<<std::endl;}virtual ~Base(){std::cout<<"Base::~Base() "<<std::endl;}};class Derived : public Base{public:    virtualint start(){m_pInt = new int [10];std::cout<<"Derived::start()"<<std::endl;}virtual ~Derived(){std::cout<<"Derived::~Derived()"<<std::endl;if(NULL != m_pInt){delete m_pInt;m_pInt = NULL;}}private:int *m_pInt;};int main(){Base *pBase = new Derived();pBase->start();delete pBase;pBase = NULL;return 0;}



原创粉丝点击