news 2026/5/9 2:37:38

先建地基,再盖楼!C++ 继承中构造与析构的顺序揭秘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
先建地基,再盖楼!C++ 继承中构造与析构的顺序揭秘

🧱 先建地基,再盖楼!C++ 继承中构造与析构的顺序揭秘

创建子类对象时,到底是先调父类构造,还是先调子类构造?
析构时又是什么顺序?
答案就藏在一句口诀里:“先父后子,先子后父”

大家好!今天我们继续深入 C++ 的继承机制,聊一个看似简单却非常关键的问题:

当子类继承父类后,创建子类对象时,构造函数和析构函数的调用顺序是怎样的?

这个问题不仅常出现在面试题中,更直接影响你对对象生命周期的理解!


🔍 从一个例子说起

看下面这段代码:

class Base { public: Base() { cout << "Base构造函数!" << endl; } ~Base() { cout << "Base析构函数!" << endl; } }; class Son : public Base { public: Son() { cout << "Son构造函数!" << endl; } ~Son() { cout << "Son析构函数!" << endl; } }; void test01() { Son s; // 创建子类对象 }

运行test01(),输出结果是:

Base构造函数! Son构造函数! Son析构函数! Base析构函数!

结论一目了然

  • 构造顺序:先父类 → 后子类

  • 析构顺序:先子类 → 后父类(与构造完全相反


🏗️ 为什么是这个顺序?

想象你在盖一栋楼:

  1. 先打地基(父类)→ 没有地基,楼怎么建?

  2. 再建主体结构(子类)→ 在地基之上施工

同理:

  • 子类可能依赖父类的成员变量或初始化状态;

  • 所以必须先确保父类构造完成,子类才能安全地构造自己。

而析构时正好反过来:

  • 先拆除上层建筑(子类),

  • 再清理地基(父类),

  • 否则可能出现“地基没了,楼还在”的危险状态!

💡 这不仅是逻辑要求,更是 C++ 语言标准强制规定的执行顺序。


📌 关键总结

阶段

调用顺序

原因说明

构造时

父类 → 子类

子类依赖父类的初始化状态

析构时

子类 → 父类

必须先清理子类资源,再释放父类资源

记住口诀
“构造:先父后子;析构:先子后父!”


⚠️ 注意事项

  1. 即使你不显式调用父类构造函数,编译器也会自动调用其默认构造函数

  2. 如果父类没有默认构造函数,你必须在子类构造函数的初始化列表中显式调用父类构造函数,否则会编译报错。
    class Base { public: Base(int x) { /* ... */ } }; class Son : public Base { public: Son() : Base(10) { } // 必须显式调用 };
  3. 析构函数建议声明为virtual(虚析构),尤其是在可能通过基类指针删除派生类对象时,避免内存泄漏(这是多态的内容,我们后续再讲)。


🎯 实际意义

理解构造/析构顺序,能帮你:

  • 正确初始化继承链中的资源(如文件句柄、网络连接等)

  • 避免在子类构造函数中访问未初始化的父类成员

  • 编写更安全、更健壮的面向对象程序


🔚 小练习

思考:如果Son类中还包含一个成员对象Member m;,那么完整的构造顺序是?

提示:父类 → 成员对象 → 子类构造函数体

欢迎在评论区写下你的答案!

💡小贴士:你提供的示例简洁明了,完美展示了继承中构造与析构的核心规律。建议动手运行一遍,观察输出,印象更深!

如果你觉得这篇推文对你有帮助,别忘了点赞、收藏、转发给一起学 C++ 的小伙伴!下期我们将探讨“继承中的同名成员处理”,敬请期待~ 😊

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 2:37:38

如何快速搭建Pokémon Showdown对战平台:完整部署指南

Pokmon Showdown是一个功能强大的开源宝可梦对战平台&#xff0c;它提供了从第一代到第九代宝可梦游戏的完整对战支持。无论你是想要体验经典对战&#xff0c;还是希望搭建自己的对战服务器&#xff0c;这个平台都能满足你的需求。本文将详细介绍从零开始搭建Pokmon Showdown的…

作者头像 李华
网站建设 2026/5/1 13:24:10

git commit --no-verify跳过钩子临时提交IndexTTS2紧急修复

git commit –no-verify跳过钩子临时提交IndexTTS2紧急修复 在一次深夜的线上故障响应中&#xff0c;某客户环境中的 IndexTTS2 语音合成系统突然出现情感控制失效的问题——原本应随滑块变化而波动的“喜悦”与“悲伤”情绪强度毫无反应&#xff0c;输出语音始终平淡如初。此时…

作者头像 李华
网站建设 2026/5/1 7:03:15

Free Texture Packer:高效游戏开发纹理打包利器

Free Texture Packer&#xff1a;高效游戏开发纹理打包利器 【免费下载链接】free-tex-packer Free texture packer 项目地址: https://gitcode.com/gh_mirrors/fr/free-tex-packer Free Texture Packer是一款专为游戏开发和网页设计优化的开源纹理打包工具&#xff0c;…

作者头像 李华
网站建设 2026/5/1 14:33:41

OpenBoardView终极指南:解密电路板文件查看器的核心技术架构

OpenBoardView终极指南&#xff1a;解密电路板文件查看器的核心技术架构 【免费下载链接】OpenBoardView View .brd files 项目地址: https://gitcode.com/gh_mirrors/op/OpenBoardView 在电子设计领域&#xff0c;你是否经常面临电路板文件格式不兼容、元件定位困难、跨…

作者头像 李华
网站建设 2026/5/1 16:43:40

csdn官网勋章体系激励用户创作IndexTTS2相关内容

CSDN勋章激励下的开源共创&#xff1a;IndexTTS2情感语音合成实践 在内容创作日益智能化的今天&#xff0c;AI语音合成技术正悄然改变着有声读物、虚拟主播和在线教育的生产方式。一个值得关注的现象是&#xff0c;国内技术社区CSDN近期推出的“勋章体系”正在激发开发者撰写高…

作者头像 李华
网站建设 2026/5/7 17:33:52

百度百科词条申请:让IndexTTS2被更多人知道

百度百科词条申请&#xff1a;让IndexTTS2被更多人知道 在智能语音技术日益渗透日常生活的今天&#xff0c;我们早已习惯了手机助手的应答、导航系统的播报&#xff0c;甚至短视频中那些语气生动的“AI旁白”。但你是否曾因一段机械呆板的合成语音而皱眉&#xff1f;又是否担心…

作者头像 李华