C++_虚析构函数

C++中的虚析构函数。

虚析构函数常用在类的有继承关系的类中。虚析构函数可以保证类中的资源被有效的回收,防止内存的泄露。


C++中正确的析构顺序是 派生类析构函数->基类析构函数。

内存的泄露会发生在基类指针指向派生类对象的时候,(即多态的时候)

例如如下代码:

#include 
using namespace std;

class Base
{
public:
	void output(){
		cout << "The Base.output() " << endl;
	}
	~Base(){
		cout << "Terminate of Base Class" << endl;
	}
};

class Derived :public Base
{
public:
	void output(){
		cout << "The Derived.output() " << endl;
	}
	~Derived(){
		cout << "Terminate of Derived Class" << endl;
	}
};

int main()
{
	Base *p = new Derived;

	p->output();

	delete p;

	return 0;
}


C++_虚析构函数_第1张图片

可以看出来:

派生类的析构函数没有被调用,若派生类的内存资源需要通过析构函数进行回收,则会发生内存的泄露。


正确的方法:将基类的析构函数声明为虚函数。则多态时,则delete基类指针的时候,会按照派生类->基类的顺序调用析构函数。(从而避免内存的泄露)

Tips:基类将函数声明为virtual,派生类也默认为virtual

示例:

#include 
using namespace std;

class Base
{
public:
	virtual void output(){
		cout << "The Base.output() " << endl;
	}
	virtual ~Base(){
		cout << "Terminate of Base Class" << endl;
	}
};

class Derived :public Base
{
public:
	void output(){
		cout << "The Derived.output() " << endl;
	}
	~Derived(){
		cout << "Terminate of Derived Class" << endl;
	}
};

int main()
{
	Base *p = new Derived;

	p->output();

	delete p;

	return 0;
}
C++_虚析构函数_第2张图片

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