Boolan-C++面向对象高级编程 学习笔记(三)

这周工作忙,就先这样吧

在本周首先学习了面向对象编程的三种主要模式:composition 复合delegation 委托以及inheritance 继承

(1)composition 复合

在一个类中,以另一个类作为数据成员,这种类与类之间的关系被称之复合。

Boolan-C++面向对象高级编程 学习笔记(三)_第1张图片

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

Boolan-C++面向对象高级编程 学习笔记(三)_第2张图片

在面向对象之前,复合就已经存在了。例如C语言中的结构,结构中就可以存放其他类型的结构。

注意使用图表示类与类之间的关系:

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

从内存角度解释composition:

Boolan-C++面向对象高级编程 学习笔记(三)_第3张图片

由Itr至deque至queue,依次能够推断出内存的大小。

在复合模式下的构造与析构:

Boolan-C++面向对象高级编程 学习笔记(三)_第4张图片

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

(2)delegation 委托

Boolan-C++面向对象高级编程 学习笔记(三)_第5张图片

委托严格意义讲也是一种复合,但是是通过指针来进行复合的形式。其中包含指针,所以注意big three。两个类通过指针关联,两个类的生命周期不同,不是同步的。

左侧可以作为对外的接口,被称之为pimpl。Pimpl(pointer to implementation, 指向实现的指针)是一种常用的,用来对“类的接口与实现”进行解耦的方法。这个技巧可以避免在头文件中暴露私有细节,因此是促进API接口与实现保持完全分离的重要机制。但是Pimpl并不是严格意义上的设计模式(它是受制于C++特定限制的变通方案),这种惯用法可以看作桥接设计模式的一种特例。Handle中的指针可以指向任意类,右侧的变动不会影响左侧,也就不会影响客户端。此手法也被称之为编译防火墙。

(3)inheritance 继承

三种模式中,继承是最为重要的模式。通过继承联系在一起的类构成一种层次关系,同在在层次的根部有一个基类,其他类则直接或者间接地从基类继承而来,这些集成得到的类为派生类。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。

Boolan-C++面向对象高级编程 学习笔记(三)_第6张图片

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

Boolan-C++面向对象高级编程 学习笔记(三)_第7张图片

对于继承关系中的构造与析构函数,主要注意以下两点:

<1>构造与析构的顺序;

<2>基类中的dtor必须是virtual,否则会出现undefined behavior。

在完成面向对象的三种基本模式的学习之后,对虚函数以及几种设计模式进行讲解:

(4)虚函数

Boolan-C++面向对象高级编程 学习笔记(三)_第8张图片

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

Boolan-C++面向对象高级编程 学习笔记(三)_第9张图片

Serialize为读文件,其中无法统一,继承自父类,为虚函数。通过上述方式,父类中的动作(Serialize)延缓至子类中实现。该设计模式为Template Method。

(5)inheritance与composition下的构造与析构,应当记住其相对应的顺序

Boolan-C++面向对象高级编程 学习笔记(三)_第10张图片

(6)设计模式

Delegation +Inheritance 模式下的Composite模式:

Boolan-C++面向对象高级编程 学习笔记(三)_第11张图片

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

Boolan-C++面向对象高级编程 学习笔记(三)_第12张图片

作者:游在路上的鱼

链接:https://www.jianshu.com/p/1679e3b6adae

來源:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(Boolan-C++面向对象高级编程 学习笔记(三))