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

第三周结构框图:

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 面向对象编程章节 谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值