美文网首页
Boolan-C++面向对象高级编程 学习笔记(三)

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

作者: FishParadise | 来源:发表于2018-01-21 22:13 被阅读0次

    这周工作忙,就先这样吧

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

    (1)composition 复合

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

    在上图中,使用了类模板的概念。使用class Sequence = deque,类似于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 模式提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。

    作者:游在路上的鱼

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

    來源:简书

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

    相关文章

      网友评论

          本文标题:Boolan-C++面向对象高级编程 学习笔记(三)

          本文链接:https://www.haomeiwen.com/subject/qqzqaxtx.html