news 2026/3/28 7:44:51

先建地基,再盖楼!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/3/25 0:29:14

BiliBiliToolPro自动化助手:3种部署方式轻松管理B站日常任务

BiliBiliToolPro是一款专为B站用户设计的自动化任务管理工具&#xff0c;能够帮助用户自动完成每日签到、经验获取、粉丝勋章管理等多种任务&#xff0c;让用户不再错过任何获取经验值的机会。这款开源工具采用C#开发&#xff0c;支持Docker、青龙面板、K8s等多种部署方式&…

作者头像 李华
网站建设 2026/3/26 21:31:49

3分钟掌握城市道路可视化:用艺术视角读懂城市脉络

3分钟掌握城市道路可视化&#xff1a;用艺术视角读懂城市脉络 【免费下载链接】city-roads Visualization of all roads within any city 项目地址: https://gitcode.com/gh_mirrors/ci/city-roads 还在为复杂的城市地图感到困惑吗&#xff1f;city-roads城市道路可视化…

作者头像 李华
网站建设 2026/3/26 15:46:04

RenPy资源管理神器rpatool:一键提取与批量处理技巧

RenPy资源管理神器rpatool&#xff1a;一键提取与批量处理技巧 【免费下载链接】rpatool A tool to work with RenPy archives. 项目地址: https://gitcode.com/gh_mirrors/rp/rpatool 你是否曾经面对RenPy游戏中的RPA档案文件感到束手无策&#xff1f;那些看似神秘的.r…

作者头像 李华
网站建设 2026/3/18 12:23:18

贝叶斯反馈修正云模型评价方法

一、核心思想与动机 传统云模型评价方法通常是“一次性”的&#xff1a; 确定评价指标体系与权重。收集数据&#xff0c;生成各指标的云模型&#xff08;数字特征&#xff1a;期望Ex&#xff0c;熵En&#xff0c;超熵He&#xff09;。通过云运算或云相似度计算&#xff0c;得…

作者头像 李华
网站建设 2026/3/12 13:30:34

Wiki.js终极指南:5分钟构建现代化企业知识库

Wiki.js终极指南&#xff1a;5分钟构建现代化企业知识库 【免费下载链接】wiki- Wiki.js | A modern and powerful wiki app built on Node.js 项目地址: https://gitcode.com/GitHub_Trending/wiki78/wiki- 还在为团队知识分散、文档版本混乱而烦恼吗&#xff1f;传统的…

作者头像 李华
网站建设 2026/3/27 14:25:34

NextStep-1:AI图像编辑新范式,高保真创作更简单

导语&#xff1a;StepFun AI推出的NextStep-1-Large-Edit模型&#xff0c;以140亿参数自回归架构与连续 tokens 创新技术&#xff0c;重新定义AI图像编辑标准&#xff0c;实现高保真内容生成与精准指令控制的双重突破。 【免费下载链接】NextStep-1-Large-Edit 项目地址: ht…

作者头像 李华