C++面试题更新 2026-08-05

在 C++ 开发中,继承和组合分别适用于哪些典型场景?请从代码复用、耦合度、灵活性和可维护性等方面阐述选择原则。

技术原理方案权衡C++

考察说明

考查对 C++ 面向对象设计中继承与组合的区别、适用场景及设计原则的掌握。

回答思路

  1. 【回答框架 1】继承是一种 is-a 关系,组合是 has-a 关系。继承通过派生类获得基类接口和实现,实现静态复用,但耦合度高,基类修改影响派生类。组合通过成员对象持有其他类实例,实现动态组合,耦合度低,符合组合优于继承原则。
  2. 【回答框架 2】继承适用场景:当类之间明显存在层次关系,需要多态行为且派生类确实可看作基类一种特化时。例如动物与狗、形状与圆形。派生类可覆盖虚函数实现差异化行为,且需要向上转型统一处理。
  3. 【回答框架 3】组合适用场景:当类之间是包含或使用关系,而非严格逻辑等价时。例如汽车拥有引擎、学生拥有书籍。组合支持运行时替换成员对象,提高灵活性,更易测试。组合也避免多重继承带来的复杂度,可用组合实现接口复用。
  4. 【回答框架 4】具体选择:若需要保存对象多态集合,用继承配合虚函数;若对象生命周期由容器管理且行为可替换,用组合。优先使用组合,除非明确需要 is-a 关系且存在多态需求。
  5. 【关键点 1】继承表示 is-a 关系,组合表示 has-a 关系。
  6. 【关键点 2】继承耦合度高、静态绑定,组合耦合度低、灵活性强。
  7. 【关键点 3】优先组合而非继承,除非确实需要多态和类型层次。
  8. 【关键点 4】组合更易测试和动态配置,继承更便于多态统一接口。
  9. 【易错点 1】不要滥用多重继承,若需多个功能,可用组合代替。
  10. 【易错点 2】避免为代码复用而强行继承,若类间无真实 is-a 关系,应改用组合。