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

请看父类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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值