问题: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;
}
程序运行结果: