虚函数与多态
1、虚函数
1、虚函数只要在任何一个成员函数之前加上virtual,成员函数就成为了虚函数;
2、继承,子类可以把父类所有的东西都继承下来,如数据、函数;其中,函数的继承继承的是调用权;
3、 成员函数可以分为三种,即非虚函数、虚函数和纯虚函数。具体如下:
应用典例:
打开文件的过程
众多类型文件的打开的过程,除了打开文件不清楚以外,其他的过程都是清楚的。因此考虑先把可以搞清楚的写出来。写好如下:
模拟过程如下:
1、在main里面先创建一个myDoc对象
2、通过子类对象调用父类的函数,其中语句myDoc.OnFileOpen();被编译器理解为:CDocument::OnFileOpen(&myDoc);
3、函数开始执行父类CDocument::OnFileOpen()的语句,直到执行到Serialize();
4、编译器发现父类中没有实现Serialize(),但子类中含有Serialize()的实现,转而执行子类中的函数;
5、执行完毕再转回执行父类,直到结束;
具体代码如下:
说明:
1、经典的Application framework部分的做法又称Template Method。此为大名鼎鼎的23个设计模式之一;
Inheritance+Composition关系下的构造和析构
图中,从内存的角度,前一个可以表述为:子类中既有父类的成分,又有复合在里面;
后一个为父类中复合,然后子类整体继承。
针对于前者,它的构造和析构的过程如下,具体的分析如下:
2、经典例子
2.1 Delegation+Inheritance
解决存储与观察的问题,情景如下:
1、文件只有一个,观察的窗口有4个;
2、一组数据,用三种方式观察(见右下角)。
经典解法:
左为存储数据,右为观察数据
左边重要的语句为:
右边重要的语句为:
另一个例子(Composite解法):
设计对话框一类的,既可以嵌套自身,又可以嵌套其他内容的东西。
经典设计方法(Composite解法):
说明:
容器里面要放一样大小的东西,当装的东西有所不同时,要使用指针
具体代码如下:
其中,考虑到,子类中Private 不能进行加的动作,但又必须继承父类的add函数,因此,折中的做法是,父类中的add函数是空的虚函数,而非其他两种。
例子(Prototype):
要创建一个继承体系,想创建未来才会使用到的的class,在不知道未来子类的名称的情况下,怎么让子类自己创造自己
其中,下划线表示是静态,负号表示成员函数为Private,正号(默认不写)表示public,#表示protected.
父类代码:
子类代码: