news 2026/4/18 7:39:28

先建地基,再盖楼!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/4/17 17:13:48

微PE启动盘集成IndexTTS2?离线环境下的语音合成应急方案

微PE启动盘集成IndexTTS2&#xff1f;离线环境下的语音合成应急方案 在一次深夜的机房断网故障中&#xff0c;运维人员面对闪烁的交换机指示灯&#xff0c;只能靠记忆和纸质手册排查问题。没有网络&#xff0c;远程支持失效&#xff1b;没有语音提示&#xff0c;操作全凭经验—…

作者头像 李华
网站建设 2026/4/14 13:47:12

音频格式转换新革命:freac让你的音乐库焕发新生

音频格式转换新革命&#xff1a;freac让你的音乐库焕发新生 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac 还在为不同设备间的音频格式不兼容而烦恼吗&#xff1f;当你的手机无法播放珍藏的FLAC无损音…

作者头像 李华
网站建设 2026/4/13 14:08:37

ModEngine2模组加载终极指南:10个关键问题诊断与优化方案

ModEngine2模组加载终极指南&#xff1a;10个关键问题诊断与优化方案 【免费下载链接】ModEngine2 Runtime injection library for modding Souls games. WIP 项目地址: https://gitcode.com/gh_mirrors/mo/ModEngine2 作为魂系游戏模组开发的核心工具&#xff0c;ModEn…

作者头像 李华
网站建设 2026/4/16 8:35:36

Eclipse EDC连接器配置参数终极指南:从入门到精通

Eclipse EDC连接器配置参数终极指南&#xff1a;从入门到精通 【免费下载链接】Connector EDC core services including data plane and control plane 项目地址: https://gitcode.com/gh_mirrors/con/Connector Eclipse EDC&#xff08;Eclipse Dataspace Connector&am…

作者头像 李华
网站建设 2026/4/12 20:03:01

如何用Magistral-Small-1.2实现多模态推理?

如何用Magistral-Small-1.2实现多模态推理&#xff1f; 【免费下载链接】Magistral-Small-2509-FP8-torchao 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/Magistral-Small-2509-FP8-torchao 导语&#xff1a;Magistral-Small-1.2作为Mistral系列的最新成员&a…

作者头像 李华
网站建设 2026/4/16 14:43:39

Flutter聊天UI终极指南:三步构建专业级聊天界面

Flutter聊天UI终极指南&#xff1a;三步构建专业级聊天界面 【免费下载链接】flutter_chat_ui Actively maintained, community-driven chat UI implementation with an optional Firebase BaaS. 项目地址: https://gitcode.com/gh_mirrors/fl/flutter_chat_ui 还在为Fl…

作者头像 李华