第三周结构框图:
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 面向对象编程章节 谢谢