当前位置: 首页 > news >正文

对于C++继承中子类与父类对象同时定义其析构顺序的探究

思考这样一串代码的运行结果:

#include <iostream>
using namespace std;
class Person
{
public:~Person() { cout << "~Person()" << endl; }
};
class Student:public Person
{
public:~Student() { cout << "~Student()" << endl; }
};int main()
{Person p;Student s;return 0;
}

结果为:

甚至这样:

 搜了不少的博客发现很少有把这样一个运行结果说清楚的,于是写一篇博客补充一下:

在我的往期文章C++入门11——详解C++继承(菱形继承与虚拟继承)中已经介绍了:

构造时先父后子,析构时先子后父。所以这里就不再详细说这个问题。


其实造成这样的运行结果原因也很简单,在我的往期文章C++入门5——C/C++动态内存管理(new与delete)中提过一嘴:局部变量是存放在栈区上的,而栈遵循先进先出,后进后出的原则:

在我们的代码中:

①p首先被定义,被压入栈中;

②然后s被定义,被压入栈中,位于p的上方;

③当main函数结束时,栈开始弹出对象进行销毁:

所以先弹出s再弹出p,又结合析构时先子后父的原则:

④Student是Person的派生类,所以s弹出时先调用~Student(),再调用~Person();

⑤p弹出时只调用~Person()。

 

 


http://www.mrgr.cn/news/31322.html

相关文章:

  • 容器化安装Jenkins部署devops
  • Go Testify学习与使用
  • 预测合理交易目标:中断形态趋势分析
  • 微服务架构陷阱与挑战
  • 4. 密码协议
  • 【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
  • 分布式消息中间件kafka
  • neo4j节点关联路径的表示、节点的增删改查
  • 【软件基础知识】什么是 API,详细解读
  • Langchain-chatchat源码部署及测试实验
  • 埃氏筛详解
  • .NET Core中的时区转换问题
  • YOLOv9改进系列,YOLOv9主干网络替换为RepViT (CVPR 2024,清华提出,独家首发),助力涨点
  • 【二级C语言考试】自定义数据类型
  • 设计模式之适配器模式
  • 4款音频转文字在线转换工具帮你解锁新的记录模式。
  • Vue-router路由
  • 电脑连接手机热点只能登陆qq和微信 浏览器无法正常上网的原因
  • 时间复杂度和空间复杂度
  • 【C++】STL----list常见用法