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

相关推荐
蜉蝣之翼❉1 小时前
CRT 不同会导致 fopen 地址不同
c++·mfc
Boilermaker19921 小时前
【Java EE】Mybatis-Plus
java·开发语言·java-ee
aramae1 小时前
C++ -- STL -- vector
开发语言·c++·笔记·后端·visual studio
Tony小周1 小时前
实现一个点击输入框可以弹出的数字软键盘控件 qt 5.12
开发语言·数据库·qt
lixzest2 小时前
C++ Lambda 表达式详解
服务器·开发语言·c++·算法
沉默媛2 小时前
如何安装python以及jupyter notebook
开发语言·python·jupyter
_Chipen3 小时前
C++基础问题
开发语言·c++
灿烂阳光g3 小时前
OpenGL 2. 着色器
c++·opengl
止观止3 小时前
JavaScript对象创建9大核心技术解析
开发语言·javascript·ecmascript
AA陈超4 小时前
虚幻引擎UE5专用服务器游戏开发-20 添加基础能力类与连招能力
c++·游戏·ue5·游戏引擎·虚幻