C++ 虚析构函数与析构函数的区别

先看下面代码:

class Parent
{
public:
	Parent();
	~Parent();
};

Parent::Parent()
{
	cout << "基类构造...." << endl << endl;
}

Parent::~Parent()
{
	cout << "基类析构..." << endl  << endl;
}


class Child :public Parent
{
public:
	Child();
	~Child();
};

Child::Child()
{
	cout << "子类构造..." << endl << endl;
}

Child::~Child()
{
	cout << "子类析构..." << endl << endl;
}

int main()
{
	Parent* pObj = new Child();
	delete pObj;
}

以上main函数执行结果为:

基类构造....

子类构造...

基类析构...

通过结果可以看出子类的析构函数没有调用。

修改代码将上面的基类和子类的析构函数都改成一下:

	virtual ~Parent();
	virtual ~Child();

执行结果如下:

基类构造....

子类构造...

子类析构...

基类析构...

比较2次结构可以看出
1、就是一个在析构的时候执行了子类的析构函数,一个在析构的时候没有执行子类的函数。
换句话说当加了virtual 后,就会先执行子类的析构函数,再执行基类的析构函数。
2、不执行析构函数,就可能会存在内存泄露。
很明显,不加virtual的情况下,子类的析构函数没有执行。

那什么情况下用virtual析构函数呢?
个人理解是,C++的特性之一就是多态,当需要用一个基类的指针new子类的对象的时候,在这种情况下,构造的时候基类和子类都有,所以析构的时候,也应该都需要,所以要加上virtual。

猜你喜欢

转载自blog.csdn.net/u011394598/article/details/82979886