对象构造顺序为从基类到派生类、再至成员对象(按声明顺序),析构则严格逆序;组合中成员生命周期由宿主完全控制,继承与组合混合时仍遵循“基类先于成员、声明序定成员序”规则。

对象构造顺序:从内到外,从基类到派生类
构造一个派生类对象时,C++ 严格按以下顺序执行:
- 先调用最顶层基类的构造函数(若有多重继承,按继承声明顺序)
- 然后依次向下,调用各层中间基类的构造函数
- 接着初始化当前类中所有非静态成员对象(按它们在类中声明的顺序,不是初始化列表顺序)
- 最后才执行当前类的构造函数体
例如:class D : public B1, public B2 { A a; C c; }; 构造顺序是:B1 → B2 → A → C → D 的构造函数体。注意:即使初始化列表写成 D() : c(), a() {},a 和 c 的实际构造顺序仍由声明顺序决定。
对象析构顺序:构造的严格逆序
析构完全反着来——后构造的先析构:
- 先执行当前类的析构函数体
- 再销毁该类中所有非静态成员对象(按声明顺序的逆序)
- 然后依次调用各基类的析构函数(与构造顺序相反,即最底层派生类 → 中间基类 → 最顶层基类)
接上例,D 对象析构顺序是:D 析构体 → c → a → B2 → B1。这个逆序保证了“谁后依赖,谁先释放”,避免访问已销毁资源。
立即学习“C++免费学习笔记(深入)”;
组合关系中的生命周期完全由宿主控制
当一个类 A 包含另一个类 B 的对象(而非指针或引用),B 的生命周期完全绑定在 A 内部:
- B 的构造发生在 A 的构造过程中(作为 A 的成员被构造)
- B 的析构发生在 A 的析构过程中(作为 A 的成员被析构)
- 哪怕 B 是 const 或引用类型(C++17 起支持成员引用),只要它是直接嵌入的,就服从同一套顺序规则
组合没有虚析构问题,也不涉及多态销毁;它只是内存布局上的“内嵌”,生命周期天然一致。
继承与组合混合时,顺序依然清晰可推
常见模式如:class Derived : public Base { Member m; };
- 构造:Base → m → Derived
- 析构:Derived → m → Base
如果 Base 自身又包含组合成员 X,那完整构造链是:X(在 Base 构造中)→ Base → m → Derived。每一层都遵循“基类先于成员、成员按声明序、派生类最后”的铁律。
基本上就这些。顺序看似琐碎,但只要记住“构造正向深入、析构逆向退出”,再叠加“继承优先于组合、声明顺序决定成员次序”,就能稳稳推出来。











