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

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

2017-07-13 20:47 204 查看
请看父类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:
virtual int 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:
virtual	int 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;
}


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