对于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()。

相关推荐
Pandaconda几秒前
【计算机网络 - 基础问题】每日 3 题(十)
开发语言·经验分享·笔记·后端·计算机网络·面试·职场和发展
loveLifeLoveCoding2 分钟前
Java List sort() 排序
java·开发语言
机器视觉知识推荐、就业指导6 分钟前
Qt/C++ TCP调试助手V1.1 新增图像传输与接收功能(附发布版下载链接)
c++·qt·tcp/ip
AngeliaXue11 分钟前
Java集合(List篇)
java·开发语言·list·集合
世俗ˊ11 分钟前
Java中ArrayList和LinkedList的比较
java·开发语言
顶呱呱程序14 分钟前
2-100 基于matlab的水果识别
开发语言·matlab·边缘检测·水果识别·特征提取·matlab-gui
wx2004110220 分钟前
Codeforces Round 973 (Div. 2) - D题
数据结构·c++·算法
Milo_K32 分钟前
项目文件配置
java·开发语言
Crossoads1 小时前
【数据结构】排序算法---基数排序
c语言·开发语言·数据结构·算法·排序算法
Ylucius1 小时前
JavaScript 与 Java 的继承有何区别?-----原型继承,单继承有何联系?
java·开发语言·前端·javascript·后端·学习