C++虚析构函数解析

 当派生类对象从内存中撤销时一般先运行派生类的析构函数,然后再调用基类的析构函数。

如果用new运算符建立的派生类的临时对象,对指向基类的指针指向这个临时对象当用delete运算符撤销对象时,系统执行的是基类的析构函数,而不是派生类的析构函数,不能彻底的“清理现场”。解决的方法是将基类及派生类的析构函数设为虚函数,这时无论基类指针指向哪个派生类对象,系统会采用动态关联,调用相应的析构函数对对象进行清理。

class Point
{
public :
          Point(){};
          ~Point(){ std::cout << "Point destructor" << std::endl; }
private :
};
class Circle: public Point
{
public :
          Circle(){};
          ~Circle(){ std::cout << "Circle destructor" << std::endl; };
private :
};
int _tmain( int argc , _TCHAR* argv[])
{
  Point *p = new Circle;
  delete p;
          getchar();
  return 0;
}

程序运行结果如下:

下面将基类的析构函数改成虚析构函数

virtual   ~Point(){ std::cout << "Point destructor" << std::endl; }

其它的不变,再运行:

这样就达到我们的目的了,基类,派生类都调用了析构函数,另外需要注意的是

在基类的析构函数声明为虚函数时,由该基类派生的析构函数也自动成为虚函数,即使派生类的析构函数与基类的析构函数名字不相同。

  程序中显示的用delete运算符删除一个对象,而这个对象是指向派生类对象的基类指针,系统调用相应派生类的析构函数。

如果程序中的局部对象离开其作用域,系统会隐式地调用其析构函数

咱们增加一个函数并从写main函数:

Point *fc()
{
  Circle cl;
  Point *p = new Circle;
  return p;
}
int _tmain( int argc , _TCHAR* argv[])
{
   Point *q =  fc();
  delete q;
          getchar();
  return 0;
}

运行结果如下:

在上例中,函数非常fc的内部定义了两个对象:c1和p所指向的Circle类对象。对象cl在函数fc结束时执行Circle的析构函数,撤销局部变量c1.p所指向的对象的地址通过函数返回值赋予q,q所指向的对象在执行delete时执行析构函数。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

带你深入理解Python属性查找

今天扣丁学堂给大家介绍一下关于python视频教程中的属性查找,首先在Python中属性查找(attributelookup)是比较复杂的,特别是涉及到描述符d...

1889
来自专栏杨熹的专栏

Day 1-Java-imooc-3.运算符

课程地址:http://www.imooc.com/learn/85 总结图片来自 http://www.imooc.com/article/10535 ? 本...

3596
来自专栏java初学

5.7 (2)反射举例

37612
来自专栏Linux驱动

指针学习(详解)

在指针中*是取内容,&是取地址 (在结构体中时:变量结构体用".",指针结构体用"->") 通常有两种的表示: 1. 通过指针向指向的地址内容赋值 *p=a;...

1695
来自专栏程序员互动联盟

【编程基础】C语言逻辑运算符

C语言关系运算符和逻辑运算符几乎无所不在,比如在循环语句、分支语句、逻辑判断等语句块中都会出现。学好这部分对学好C语言具有重要作用。 C语言中有一共有如下6中...

3626
来自专栏十月梦想

each()list()while遍历数组

each()函数:需要一个数组作为参考,each函数返回1,0,key,value键值,0,key返回键,1,value对应的值,

891
来自专栏desperate633

详解javascript中的即时函数,内部函数,能重写自身的函数即时函数内部函数返回函数的函数能重写自己的函数小结

在上篇谈到匿名函数和回调函数的基础上,我们接着介绍javascript中的即时函数,内部函数,返回函数的函数,能重写自身的函数等几种常见的函数类型及使用方法。只...

821
来自专栏weixuqin 的专栏

java 复习总结

类采用首字母大写的方式来命名,如果是多个单词的类名,则每个单词首字母都大写,例如:HelloWorld 。

862
来自专栏calmound

Xtu 1150 Assembly Line

http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1150 题意:任意多个ABC三个数,...

2777
来自专栏土豆专栏

Java面试之comparator与comparable

compareTo(T o),比较此对象与指定对象的顺序。如果该对象小于等于或者大于指定对象,则分别返回负整数、零、正整数

1561

扫码关注云+社区