博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构造以及析构函数的调用
阅读量:5040 次
发布时间:2019-06-12

本文共 855 字,大约阅读时间需要 2 分钟。

说明以下程序的显示结果:

#include 
using namespace std;class A{public: A() {cout<<"This is A()"<
hello(); delete ptr; return 0;}

 

显示结果:

This is A()This is B()Hello BThis is ~A()

即没有调用B的析构函数

解析:

一般情况下构造函数调用父类-》子类;析构函数调用子类-》父类

比如这么写

 B *ptr=new B(); 先  析构 B类 再析构A类

但如果是上面那种写法

A *ptr=(A *)new B();...delete ptr;

结果就是构造函数相同,析构函数只调用A,因为ptr的类型是A,delete ptr时将调用类型A的析构函数;没析构B,造成内存泄露

一般遇到这样的现象,需要将基类的析构函数定义为虚拟的

这样的话,情况就是:析构函数调用过程为子类->父类,不过内部原理不一样 delete ptr时调用类型A的析构函数步骤如下:

1,到虚函数映射表中查找A的实际析构函数;
2,发现被实例化为B的析构函数;
3,调用B的析构函数;
4,调用A的析构函数--如果A的析构不是纯虚函数的话

运行结果为:

This is A()This is B()Hello Bthis is ~B()This is ~A()

即调用了B的析构函数

 

另这里基类的hello()函数是虚函数,所以ptr->hello()用的是子类的hello()函数,如果基类的hello()不是虚函数,则会调用基类的hello()

 

posted on
2016-04-21 21:15 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/dengnilikai/p/5418788.html

你可能感兴趣的文章
超详细的Guava RateLimiter限流原理解析
查看>>
VueJS ElementUI el-table 的 formatter 和 scope template 不能同时存在
查看>>
Halcon一日一练:图像拼接技术
查看>>
Swift - RotateView
查看>>
iOS设计模式 - 中介者
查看>>
centos jdk 下载
查看>>
HDU 1028 Ignatius and the Princess III(母函数)
查看>>
关于多路复用器的综合结果
查看>>
(转)面向对象最核心的机制——动态绑定(多态)
查看>>
token简单的使用流程。
查看>>
django创建项目流程
查看>>
UIActionSheet 修改字体颜色
查看>>
Vue 框架-01- 入门篇 图文教程
查看>>
Spring注解之@Lazy注解,源码分析和总结
查看>>
多变量微积分笔记24——空间线积分
查看>>
Magento CE使用Redis的配置过程
查看>>
poi操作oracle数据库导出excel文件
查看>>
(转)Intent的基本使用方法总结
查看>>
Mac 下的Chrome 按什么快捷键调出页面调试工具
查看>>
Windows Phone开发(24):启动器与选择器之发送短信
查看>>