虚(virtual)析构函数

更新时间:2023-05-14 19:13:59 阅读: 评论:0

虚(virtual)析构函数
记得有⼀次在⾯试的时候被问到虚析构函数的作⽤,当时回答得不是很好,故现在想重新整理下。
先看下下⾯的代码:
#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()
{
Ba *pBa;
pBa = new Derived();
cout<<"*************************************"<<endl;
pBa->f();
cout<<"*************************************"<<endl;
delete pBa;
system("pau");
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:
Ba(){cout<<"Ba::constructor is called!"<<endl;}
阿胶固元膏的功效
virtual ~Ba()=0;//这⾥是会出现问题的,如果这个函数确实什么也不想做,
//那么⾄少定义为virtual ~Ba()=0{}。
干净的净怎么写
virtual void f(){cout<<"Ba::f() is called!"<<endl;};
};
许德珩好了,就说到这吧!虚析构函数的⽤法虽然简单,但它在⾯向对象程序设计中却是⼀个重要的技巧。那我们以后在这⽅⾯也要多加注意了哦!

本文发布于:2023-05-14 19:13:59,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/897871.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   基类   虚析构   继承   结果   问题   没有   指针
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图