news 2026/4/23 0:41:46

先建地基,再盖楼!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/23 9:28:27

Spotify音乐下载完整指南:永久保存你的音乐收藏

Spotify音乐下载完整指南&#xff1a;永久保存你的音乐收藏 【免费下载链接】spotify-downloader Download your Spotify playlists and songs along with album art and metadata (from YouTube if a match is found). 项目地址: https://gitcode.com/gh_mirrors/spotifydow…

作者头像 李华
网站建设 2026/4/23 9:25:05

Oni-Duplicity终极教程:5分钟掌握《缺氧》存档编辑神器

Oni-Duplicity终极教程&#xff1a;5分钟掌握《缺氧》存档编辑神器 【免费下载链接】oni-duplicity A web-hosted, locally-running save editor for Oxygen Not Included. 项目地址: https://gitcode.com/gh_mirrors/on/oni-duplicity 还在为《缺氧》游戏中的资源短缺而…

作者头像 李华
网站建设 2026/4/23 9:24:13

Qwen3-8B-MLX-8bit:如何玩转AI双模式推理?

Qwen3-8B-MLX-8bit&#xff1a;如何玩转AI双模式推理&#xff1f; 【免费下载链接】Qwen3-8B-MLX-8bit 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-8B-MLX-8bit 导语&#xff1a;Qwen3-8B-MLX-8bit模型正式登场&#xff0c;凭借独特的"思考模式&quo…

作者头像 李华
网站建设 2026/4/23 9:27:51

告别风扇噪音!FanControl让你的电脑既安静又凉爽

告别风扇噪音&#xff01;FanControl让你的电脑既安静又凉爽 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanC…

作者头像 李华
网站建设 2026/4/23 13:58:55

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 还在为Flut…

作者头像 李华