对象构造顺序为从基类到派生类、再至成员对象(按声明顺序),析构则严格逆序;组合中成员生命周期由宿主完全控制,继承与组合混合时仍遵循“基类先于成员、声明序定成员序”规则。
构造一个派生类对象时,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 内部:
入的,就服从同一套顺序规则组合没有虚析构问题,也不涉及多态销毁;它只是内存布局上的“内嵌”,生命周期天然一致。
常见模式如:class Derived : public Base { Member m; };
如果 Base 自身又包含组合成员 X,那完整构造链是:X(在 Base 构造中)→ Base → m → Derived。每一层都遵循“基类先于成员、成员按声明序、派生类最后”的铁律。
基本上就这些。顺序看似琐碎,但只要记住“构造正向深入、析构逆向退出”,再叠加“继承优先于组合、声明顺序决定成员次序”,就能稳稳推出来。