析构函数用于在销毁对象时进行清理工作,可以声明为虚函数,而且有时候必须声明为虚函数。
#include <iostream>
using namespace std;
//基类
class Base{
public:
Base();
~Base();
protected:
char *str;
};
//构造函数:分配100个char类型的内存空间
Base::Base(){
str = new char[100];
cout<<"Base constructor"<<endl;
}
//析构函数:把分配的内存释放掉
Base::~Base(){
delete[] str;
cout<<"Base destructor"<<endl;
}
//派生类
class Derived: public Base{
public:
Derived();
~Derived();
private:
char *name;
};
Derived::Derived(){
name = new char[100];
cout<<"Derived constructor"<<endl;
}
Derived::~Derived(){
delete[] name;
cout<<"Derived destructor"<<endl;
}
int main(){
Base *pb = new Derived(); //基类指针,指向派生类
delete pb;
cout<<"-------------------"<<endl;
Derived *pd = new Derived(); //派生类指针,指向基类
delete pd;
return 0;
}
// 指针pd只调用了基类的析构函数,没有调用派生类的析构函数
Base constructor
Derived constructor
Base destructor
-------------------
// 指针pd同时调用了基类和派生类的析构函数
Base constructor
Derived constructor
Derived destructor
Base destructor
#include <iostream>
using namespace std;
//基类
class Base{
public:
Base(); //构造函数
virtual ~Base(); //析构函数
protected:
char *str;
};
Base::Base(){
str = new char[100];
cout<<"Base constructor"<<endl;
}
Base::~Base(){
delete[] str;
cout<<"Base destructor"<<endl;
}
//派生类
class Derived: public Base{
public:
Derived();
~Derived();
private:
char *name;
};
Derived::Derived(){
name = new char[100];
cout<<"Derived constructor"<<endl;
}
Derived::~Derived(){
delete[] name;
cout<<"Derived destructor"<<endl;
}
int main(){
Base *pb = new Derived();
delete pb;
cout<<"-------------------"<<endl;
Derived *pd = new Derived();
delete pd;
return 0;
}
/*运行结果*/
Base constructor
Derived constructor
Derived destructor
Base destructor
-------------------
Base constructor
Derived constructor
Derived destructor
Base destructor
大部分情况下都应该将基类的析构函数声明为虚函数,否则就有内存泄漏的风险。
原文:https://www.cnblogs.com/xiaobaizzz/p/12334858.html