组合 has-a vs 继承 is-a

两种代码重用关系 —— 组合是「有一个」(汽车有发动机),继承是「是一个」(狗是动物)
组合 · has-a「有一个」 class Car 整体 (whole) Engine engine; 发动机对象 · 作为数据成员 部分 (a part of) · 嵌在 Car 内部 has-a class Car { Engine engine; /* … */ }; 继承 · is-a「是一个」 class Animal 基类 base · eat() / breathe() is-a class Dog : public Animal ↑ 继承得到 Animal 的全部成员 + bark(); 派生类新增 怎么选?问一句话就分清 「A 拥有一个 B 吗?」→ 用组合 Car 有 Engine、Person 有 Address B 是 A 的零件,把 B 当成员;耦合更松 「A 是一种 B 吗?」→ 用继承 Dog 是 Animal、Taxi 是 Car A 可当作 B 使用,复用并扩展基类