C++的析构函数与虚函数实战
作者:互联网
一 点睛
在C++中,构造函数不能声明为虚函数。然而,析构函数可以声明为虚函数。
C++明确指出,当派生对象经由一个基类指针被删除、而该基类带着一个非虚函数析构函数,会导致对象的派生成分无法被销毁。
二 析构函数不是虚函数容易引发内存泄露
1 代码
#include<iostream>
using namespace std;
class Base{
public:
Base(){ std::cout<<"Base::Base()"<<std::endl; }
~Base(){ std::cout<<"Base::~Base()"<<std::endl; }
};
class Derive:public Base{
public:
Derive(){ std::cout<<"Derive::Derive()"<<std::endl; }
~Derive(){ std::cout<<"Derive::~Derive()"<<std::endl; }
};
int main(){
Base* pBase = new Derive();
/*这种base classed的设计目的是为了用来"通过base class接口处理derived class对象"*/
delete pBase;
return 0;
}
2 运行
[root@localhost charpter02]# g++ 0231.cpp -o 0231
[root@localhost charpter02]# ./0231
Base::Base()
Derive::Derive()
Base::~Base()
3 说明
两个类各自有构造函数和析构函数,并且基类和派生类的析构函数都是非虚函数。从执行结果来看,虚构函数的调用是存在问题的,也就是说析构函数只做了局部销毁工作,这可能造成资源泄露、损坏数据结构等问题。
解决此问题的方法:只要给基类一个virtual 析构函数即可。
三 基类的析构函数为虚函数
1 代码
#include<iostream>
using namespace std;
class Base{
public:
Base(){ std::cout<<"Base::Base()"<<std::endl; }
virtual ~Base(){ std::cout<<"Base::~Base()"<<std::endl; }
};
class Derive:public Base{
public:
Derive(){ std::cout<<"Derive::Derive()"<<std::endl; }
~Derive(){ std::cout<<"Derive::~Derive()"<<std::endl; }
};
int main(){
Base* pBase = new Derive();
delete pBase;
return 0;
}
2 运行
[root@localhost charpter02]# g++ 0232.cpp -o 0232
[root@localhost charpter02]# ./0232
Base::Base()
Derive::Derive()
Derive::~Derive()
Base::~Base()
3 说明
把基类的析构函数声明为虚函数,就能正常析构了。
标签:std,Derive,函数,C++,Base,析构,基类 来源: https://blog.csdn.net/chengqiuming/article/details/89743024