Boolan网——C++微专业第三周学习笔记
在本周首先学习了面向对象编程的三种主要模式:composition 复合、delegation 委托以及inheritance 继承。
(1)composition 复合
在一个类中,以另一个类作为数据成员,这种类与类之间的关系被称之复合。

在上图中,使用了类模板的概念。使用class Sequence = deque<T>,类似于typedef。将deque替换至代码中:

在面向对象之前,复合就已经存在了。例如C语言中的结构,结构中就可以存放其他类型的结构。
注意使用图表示类与类之间的关系:

queue拥有deque,其中的所有的功能都是调用的deque中的功能,属于一个特殊的例子。queue是一个先进先出的队列,而deque为两端都能进出的队列。deque的功能比queue的功能强大。deque的部分功能向queue开放。该设计模式称之为Adapter(适配器)。
从内存角度解释composition:

由Itr至deque至queue,依次能够推断出内存的大小。
在复合模式下的构造与析构:

红色部分代码是编译器自动添加的。注意使用的默认构造函数。否则需要手动添加合适的构造函数。
(2)delegation 委托

委托严格意义讲也是一种复合,但是是通过指针来进行复合的形式。其中包含指针,所以注意big three。两个类通过指针关联,两个类的生命周期不同,不是同步的。
左侧可以作为对外的接口,被称之为pimpl。Pimpl(pointer to implementation, 指向实现的指针)是一种常用的,用来对“类的接口与实现”进行解耦的方法。这个技巧可以避免在头文件中暴露私有细节,因此是促进API接口与实现保持完全分离的重要机制。但是Pimpl并不是严格意义上的设计模式(它是受制于C++特定限制的变通方案),这种惯用法可以看作桥接设计模式的一种特例。Handle中的指针可以指向任意类,右侧的变动不会影响左侧,也就不会影响客户端。此手法也被称之为编译防火墙。
(3)inheritance 继承
三种模式中,继承是最为重要的模式。通过继承联系在一起的类构成一种层次关系,同在在层次的根部有一个基类,其他类则直接或者间接地从基类继承而来,这些集成得到的类为派生类。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。

通过上图可以看出父类的数据是被完整继承下来的。

对于继承关系中的构造与析构函数,主要注意以下两点:
<1>构造与析构的顺序;
<2>基类中的dtor必须是virtual,否则会出现undefined behavior。
在完成面向对象的三种基本模式的学习之后,对虚函数以及几种设计模式进行讲解:
(4)虚函数

通过以下例子对虚函数有了更为深刻的理解:

Serialize为读文件,其中无法统一,继承自父类,为虚函数。通过上述方式,父类中的动作(Serialize)延缓至子类中实现。该设计模式为Template Method。
(5)inheritance与composition下的构造与析构,应当记住其相对应的顺序

(6)设计模式
Delegation +Inheritance 模式下的Composite模式:

以及Delegation +Inheritance 模式下的Prototype模式:Prototype 模式提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。
