Composition (复合) has-a
- 一个类中包含另一个
类对象的数据成员
- deque已经完成了所有功能, queue只是调用deque中所需要的功能, 来实现queue的特性
- adapter : 把一个功能已经很强大的类进行改装, 适配成另一个类 (只开放部分接口, 甚至更改命名)

构造和析构
- 构造 : 由内到外
- 析构 : 由外到内
- 默认情况是下列情况, 红色部分是编译器自行添加, 也可以
自定义指定对应的构造和析构函数
Delegation (委托) Composition by reference
- 一个类包含另一个
类指针对象的数据成员
- 两个类对象的生命周期并不同步, 可能先创建指针, 之后才创建对象
- pointer to implementation (pImpl ; handle / body) : 图中左边的类只是一个接口, 具体的实现调用的都是右边的类函数
- 右边无论如何改变, 都不会影响左边,
编译防火墙
- pImpl 可以用来实现reference counting, 多个对象共享一份数据, 但当更改其中一个时需要进行copy on write(COW)
Inheritance (继承) is-a
- 大象是一种动物, 不能说动物是一种大象. 因此是大象继承自动物
- 子类包含父类的部分成员 (和权限关键字有关)

构造和析构

virtual functions
数据继承会实实在在分配内存, 函数继承只是继承了调用权, 函数仍然只有一份.
- non-virtual function : 不希望derived class override
- virtual function : 希望derived class override
- pure virtual function : derived class must override

- 一个形状的类, 并不能实例化对象, 因为没有一个叫做形状的图形
- 它可以派生出三角形, 正方形, 长方形等等具体的形状的类, 它们进一步实例化对象
- 形状基类中用一个objectID函数给每一个之后实例化的对象一个流水ID号 (统一分配的, 并不需要子类重写)
- 形状基类中用一个error函数输出实例化中可能出现的错误, 基类中实现了一个默认的错误输出, 子类可以根据自身情况改写这个错误输出, 也可以使用默认的
- 形状基类中使用draw函数来画各个图形, 因为每一个子类画的形状都不一样, 并且基类本身也无法具体实现, 因此是pure virtual function, 要求子类必须override.
Template Method
- 父类中实现了一般性的大部分功能, 把一些关键功能延缓到子类去override


Inheritance + Composition
- 第一种构造顺序 : Base Component Derived
- 第二种构造顺序 : Component Base Derived
相关文章: