美文网首页
Boolan C++面向对象高级编程(上) 第三周笔记 暗影行者

Boolan C++面向对象高级编程(上) 第三周笔记 暗影行者

作者: hongXkeX | 来源:发表于2017-04-21 11:52 被阅读32次

    第三周结构框图:

    11.组合与继承
    
    12.虚函数与多态
    
    13.委托相关设计
    
    14.复合&继承关系下的构造和析构
    

    注:部分笔记写在打印出的课件上,如下第三张图片上的字

    11.组合与继承:

    前两周讲的是单个类的设计,即基于对象编程
    本周是讲类与类之间的关系,即面向对象编程
    

    学习类与类之间的关系,我们只需要了解以下三种关系即可:


    这里写图片描述

    先找最简单的来讲:


    这里写图片描述
    初学者可能不习惯看上面的,现在把deque替换进去:
    
    这里写图片描述
    queue中含有deque,即queue和deque是复合关系。(即只要A含有B,则就是一种复合关系)。但看代码,queue中的功能,都由dequeue完成。Dequeu的功能比较强大,此例子比较特殊,是一种Adapter(改造)模式(设计模式一种)。
    

    从内存角度分析上例:


    这里写图片描述

    复合关系下的构造和析构:

    这里写图片描述
    构造,由内而外!  析构,由外而内!
    
    编译器会自己去构造Component对象
    container的构造函数首先调用component的default构造函数
    
    Container的析构先调用自己,然后再调用Component的析构函数(编译器帮助完成,我们只要管理好Container的构造和析构就可以)
    

    Delegation委托:

    一种微弱的组合关系,不是含有component,而是含有component的指针
    
    这里写图片描述
    左边是接口,右边是具体实现
    详细笔记请看照片上的文字
    
    这里写图片描述
    继承观念:父类的数据是被完整继承下来的
    继承有三种方式,public,protected,private继承。最常用的public继承,是说is-a关系(不要认为深奥,is a就是说明其是一种类型)。
    

    继承关系下的构造和析构:


    这里写图片描述
    析构由内而外才坚固
    析构右外而内才稳定
    

    12.虚函数与多态:

    笔记都在图上了:


    这里写图片描述
    继承搭配上虚函数才可以强而有力
    1.子类可以继承父类的所有内容,包括数据和函数。
    2.从内存角度,可以继承数据
    3.对于函数,不能从内存角度理解,而是子类继承了父类的函数调用权。
    

    有虚函数的继承:


    这里写图片描述

    实现上图的代码:


    这里写图片描述

    继承关系下的构造和析构:


    这里写图片描述

    同样,构造由内而外。
    Derived的构造函数首先调用Base的default构造函数,然后调用Component的default构造函数,然后才执行自己。

    析构由外而内。
    Derived的析构函数首先执行自己,然后调用Component的析构函数,然后调用Base的析构函数

    重点内容
    看看下图用到了什么:

    这里写图片描述

    上图用到了委托和继承组合:


    这里写图片描述
    1.委托和继承组合是组合中最强大的一种
    2.父类Observer用来观察左边,左边有使用到C++容器,并且有遍历所有观察者的动作。
    

    13.委托相关设计:

    设计模式之composite:


    这里写图片描述
    设计模式较复杂,请看照片上笔记吧
    

    设计模式之Prototype:


    这里写图片描述

    Prototype父类代码:


    这里写图片描述

    Prototype子类代码:


    这里写图片描述

    14.复合&继承关系下的构造和析构:

    继承关系下的构造和析构:


    这里写图片描述
    构造由内而外,析构由外而内
    注意:红色的代码是编译器替我们加的,不用自己编写。
    

    复合关系下的构造和析构:


    这里写图片描述
    同样,构造由内而外,析构由外而内
    

    继承&复合关系下的构造和析构:


    这里写图片描述
    仍然,构造由内而外,析构由外而内
    大部分编译器,构造时先调用父类的构造函数,再调用复合成分的;析构时次序相反。
    

    拓展:

    面向对象编程基于三个基本概念:

    1.数据抽象-类
    2.继承-基类/派生类
    3.动态绑定-基类的函数or派生类的函数
    

    面向对象编程概述:

    1.面向对象编程的关键思想是多态性(polymorphism)。多态性派生于一个希腊单词,意思是“许多形态”,之所以称通过继承而相关联的类型为多态类型,是因为在许多情况下可以互换地使用派生类型或基类型的“许多形态”。在C++中,多态性仅用于通过继承而相关联的类型的引用或指针。
    2.在C++中,基类必须指出希望派生类重写哪些函数,定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。
    3.在C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的。
    4.引用和指针的静态类型与动态类型可以不同,这是 C++ 用以支持多态性的基石。
    

    详请参考C++Prime 面向对象编程章节 谢谢

    相关文章

      网友评论

          本文标题:Boolan C++面向对象高级编程(上) 第三周笔记 暗影行者

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