虚(virtual)析构函数
记得有⼀次在⾯试的时候被问到虚析构函数的作⽤,当时回答得不是很好,故现在想重新整理下。2020年12月六级成绩查询时间
先看下下⾯的代码:
#include <stdio.h>加油用英语怎么说
#include <iostream>
using namespace std;
class Ba
{
public:
Ba(){cout<<"Ba::constructor is called!"<<endl;}
~Ba(){cout<<"Ba::destructor is called!"<<endl;}//⼤家关键是看这句
初二上册英语单词
virtual void f(){cout<<"Ba::f() is called!"<<endl;};
};
class Derived:public Ba
{
public:
Derived(){cout<<"Derived::constructor is called!"<<endl;}
~Derived(){cout<<"Derived::destructor is called!"<<endl;}服务生的英文
virtual void f(){cout<<"Derived::f() is called!"<<endl;}
};
int main()
{
ecw
Ba *pBa;
pBa = new Derived();
cout<<"*************************************"<<endl;
pBa->f();
cout<<"*************************************"<<endl;
delete pBa;
system("pau");deutsch
return 0;
}
⼤家猜猜输出结果如何?
以下是输出结果:
雅思写作
Ba::constructor is called!
Derived::constructor is called!
*************************************
Derived::f() is called!
*************************************
Ba::destructor is called!
请按任意键继续. . .
没错,也许你已经看出问题的所在了。C++明确指出,当⼀个继承类经由⼀个基类的指针删除时,⽽该基类包含的是⼀个⾮虚析构函数,其结果是未定义的(实际执⾏时通常发⽣的是继承类的独有成分没有被销毁。这个后果很严重,会造成内存泄漏。
不过解决这个问题的⽅法也很简单。只要你在Ba类的析构函数~Ba()前加上⼀个virtual就⾏了。这时通过基类指针删继承类会得到你期望的结果。
三年级下册英语期末试卷
如下是使⽤了虚析构函数后的输出结果:
Ba::constructor is called!
Derived::constructor is called!
*************************************
Derived::f() is called!
*************************************
Derived::destructor is called!
雅思培训哪个比较好Ba::destructor is called!
请按任意键继续. . .
哈哈,有意思吧。以后在通过基类指针删继承类时你可要注意了啊!别忘了在基类声明⼀个虚析构函数!
问题还没有结束。我们知道,如果定义了⼀个普通的纯虚(pure-virtual)函数的话,这个纯虚(pure-virtual)函数是可以不带函数体的。但这并对纯虚(pure-virtual)析构函数来说并不成⽴。如果我们在基类中将析构函数定义为pure-virtual类型,那么我们也必须为这个函数提供⼀份实现。
下⾯是代码说明:
class Ba
{
public:neway
Ba(){cout<<"Ba::constructor is called!"<<endl;}
virtual ~Ba()=0;//这⾥是会出现问题的,如果这个函数确实什么也不想做,
//那么⾄少定义为virtual ~Ba()=0{}。
virtual void f(){cout<<"Ba::f() is called!"<<endl;};
};
好了,就说到这吧!虚析构函数的⽤法虽然简单,但它在⾯向对象程序设计中却是⼀个重要的技巧。那我们以后在这⽅⾯也要多加注意了哦!