问题:C++虚拟函数的简单范例

本程序通过VC++ 6.0编译与测试,两段程序分别演示了不使用虚析构函数和使用虚析构函数的结果,具体代码如下:

//未使用虚析构函数,程序目的:删除子类和父类的变量
#include <iostream>
using namespace std;

class Base
{
public:
	Base(){}
	//virtual  //未使用虚析构函数 

	~Base()
	{
		cout<<"Base destructor!"<<endl;
	}
};

class Derived : public Base
{
public:
	Derived(){}
	~Derived()
	{
		cout<<"Derived destructor!"<<endl;
	}
};

int main()
{
	Base *p=new Derived();//声明一个子类对象在堆区
	delete p;//p是父类指针,在没有虚函数的情况下,操作父类的指针,调用父类的析构
	//子类只释放了继承自父类的成员,子类自身的成员没有释放,造成内存的泄露
	return 0;
}

程序运行结果:



//使用虚析构函数,程序目的:删除子类和父类的成员
#include <iostream>
using namespace std;

class Base
{
public:
	Base(){}
	virtual  //注意,此处使用了虚析构函数 
	~Base()
	{
		cout<<"Base destructor!"<<endl;
	}
};

class Derived : public Base
{
public:
	Derived(){}
	~Derived()
	{
		cout<<"Derived destructor!"<<endl;
	}
};

int main()
{
	Base *p=new Derived();//声明一个子类对象在堆区
	delete p;//使用虚析构函数时,既释放了子类也释放了父类的成员
	return 0;
}

程序运行结果: