其他分享
首页 > 其他分享> > 析构函数与虚析构函数

析构函数与虚析构函数

作者:互联网

建议

在程序中最好把基类的析构函数声明为虚函数,即使基类不需要析构函数,也显示定义一个结构体为空的虚析构函数,以保证在撤销动态分配空间时能得到正确的处理。

例题 7-1 马会飞 (15分)
已知Horse类是Pegasus类的父类,根据以下主函数完善程序内容,以实现规定的输出。不允许改变主函数的内容。

int main()
{
	Horse *p1 = new Horse; //输出:Horse 申请了空间...
	Horse *p2 = new Pegasus; /*  输出两行:
	                             Horse 申请了空间...
	                             Pegasus 申请了空间...   
			         */	
	cout << endl; 
	
	p1->Fly(); //输出:Just a horse.
	p2->Fly(); //输出:I can fly!
	cout << endl; 
	
	delete p1; //输出:Horse 释放了空间...
	delete p2;  /* 输出两行:
	               Pegasus 释放了空间... 
	               Horse 释放了空间... 
		    */
	return 0;
}

无输入样例
输出样例

Horse 申请了空间...
Horse 申请了空间...
Pegasus 申请了空间...

Just a horse.
I can fly!

Horse 释放了空间...
Pegasus 释放了空间...
Horse 释放了空间...

AC代码

#include<iostream>
using namespace std;
class Horse {
public:
	virtual void Fly() {
		cout << "Just a horse." << endl;
	}
	Horse() { cout << "Horse 申请了空间..." << endl; }
	virtual ~Horse() {
		cout << "Horse 释放了空间..." << endl;
	}
};

class Pegasus :public Horse {
public:
	virtual void Fly() {
		cout << "I can fly!" << endl;
	}
	~Pegasus() { cout << "Pegasus 释放了空间..." << endl; }
	Pegasus() :Horse(){
		cout << "Pegasus 申请了空间..." << endl;
	}
};
int main()
{
	Horse *p1 = new Horse; //输出:Horse 申请了空间...
	Horse *p2 = new Pegasus; /*  输出两行:
	                             Horse 申请了空间...
	                             Pegasus 申请了空间...   
			         */	
	cout << endl; 
	
	p1->Fly(); //输出:Just a horse.
	p2->Fly(); //输出:I can fly!
	cout << endl; 
	
	delete p1; //输出:Horse 释放了空间...
	delete p2;  /* 输出两行:
	               Pegasus 释放了空间... 
	               Horse 释放了空间... 
		    */
	return 0;
}

先说结论

只有当基类的析构函数被声明为虚函数时,派生类调用析构函数时才会一起按照派生->对象成员->基类的顺序调用析构函数,否则智慧调用派生类自己的析构函数
例如

virtual ~Horse() {//声明了虚函数
		cout << "Horse 释放了空间..." << endl;
	}

没有声明虚函数

~Horse() {
		cout << "Horse 释放了空间..." << endl;
	}

建议

在程序中最好把基类的析构函数声明为虚函数,即使基类不需要析构函数,也显示定义一个结构体为空的虚析构函数,以保证在撤销动态分配空间时能得到正确的处理。

标签:...,Horse,函数,析构,基类,虚析构,cout
来源: https://www.cnblogs.com/xiao-qingjiang/p/13080676.html