博览网学习笔记:
第三周课程的知识点:
11.组合与继承
注意:前两周讲的是单个类的设计,即基于对象编程。
本周是讲类与类之间的关系,即面向对象编程。
类与类的三种关系:
1.复合composition
1)我们举例来解释复合:
我们新建一个类queue,queue中含有deque,因deque功能强大,queue使用的功能,即queue包含deque的功能,我们称之为复合关系。(即只要A含有B,则就是一种复合关系)。次例中queue功能都由deque实现。
其关系可用下图表示:
2)复合的关系下的构造与析构:
上图也可表示为:
构造函数由由内(component)而外(container)!
container的构造函数首先调用component的默认的构造函数,然后执行自己的构造函数。(这部分知识,我么只需要了解即可。编译器会自动帮助我们正确调用函数)
析构,由外(container)而内(component)!
container的析构函数首先执行自己的析构函数,然后调用component的析构函数。(若先执行component的析构函数,则内部崩塌,编译器报错)
2.委托delegation
1)一种特殊的复合关系,不是含有component,而是含有component的指针。
2)表示为:
3.继承inheritance
1)举例:
class a
{
........
}
class b:public a {};
即类b继承类a中的功能,或者说类b是一种类a(子类b中有父类a的成分)。
2)表示为
注意:父类的析构函数必须是虚函数,否则会报错
3)构造与析构函数的执行顺序:
构造函数由内而外:
子类,也即衍生类(derived)的构造函数先调用父类(base)的默认构造函数,然后执行自己的;
析构由内外而内:
子类先执行自己的析构函数,然后才调用父类的析构函数;
12.虚函数与多态
1.初识虚函数:
非虚函数(non-virtual):不希望子类重新定义(override)这个函数;
虚函数(virtual):希望子类重新定义(override)这个函数,且父类以对其进行默认定义,但子类不是必须定义这个函数;
纯虚函数(pure virtual):希望子类一定重新定义(override)这个函数;对其没有默认定义,例:virtual void draw()const=0;
2.继承搭配上虚函数才可以强而有力
1).子类可以继承父类的所有内容,包括数据和函数。
2).从内存角度,可以继承数据
3).对于函数,不能从内存角度理解,而是子类继承了父类的函数调用权。
13.委托相关设计
设计模式之composite:
以file system为例:
设计模式之Prototype,笔记见下图: