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

简介: 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天前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
8 1
|
1天前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
11 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
19小时前
|
C语言 C++
C++番外篇——string类的实现
C++番外篇——string类的实现
9 0
|
19小时前
|
C++ 容器
C++入门7——string类的使用-2
C++入门7——string类的使用-2
10 0
|
19小时前
|
C语言 C++ 容器
C++入门7——string类的使用-1
C++入门7——string类的使用-1
11 0
|
1天前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
7 0
|
1天前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
10 0
|
2天前
|
安全 编译器 程序员
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
13 2
|
2天前
|
存储 C++
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
12 2
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
|
1天前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
13 3