组合 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 使用,复用并扩展基类
▶ 重播