- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第08讲-面向对象编程
Visual C++面向对象编程
第3章 C++面向对象程序设计
基本内容
多态
虚函数
纯虚函数与抽象类
模板
函数模板
类模板
多态(基类指针指向派生类对象)
C++允许一个基类对象指针指向其派生类对象指针(这是实现虚函数的关键!),但是不允许一个派生类对象指针指向基类对象。
使用指向派生类对象的基类指针只能访问派生类中从基类继承的公有成员,不能访问派生类自定义的成员。除非通过强制类型转换。
教材p105:例3-25
多态(虚函数)
利用虚函数机制,程序员可以在基类和派生类中使用相同的函数名和参数类型,而定义不同的操作。这样就为同一个类体系中所有派生类的同一类行为(实现方法 不同)提供了统一的接口, 即“一种接口,多种方法”。
动态多态性是指同一类继承结构中不同类的对象对同一个消息表现独特行为的能力,当使用形如“对象-消息”的指令发送消息时,可以将同一个消息发给不同类的对象,并表现出不同类型的响应。
多态(虚函数)
使用关键字virtual在基类中声明虚函数
在不同派生类中给出虚函数的不同实现版本
使用基类指针指向不同派生类对象并调用虚函数
例3-3-3
2007年期末考试题 第五题(1):
写一个程序,定义抽象基类Shape,由它派生出3个派生类:circle(圆形)、square(正方形)和Rectangle(矩形)。用虚函数分别计算几种图形面积,并求它们的和。(15分)
例3-3-4
多态(虚函数)
通常情况下,析构函数的调用顺序是先派生类,后基类。
但是当基类对象指针指向的是使用 new 创建派生类对象时,使用 delete 删除派生类对象时就会只调用基类析构函数。解决问题的办法是将虚构函数声明为虚函数,即虚析构函数。
例3-3-5
由于构造函数的调用顺序是先基类,后派生类。所以构造函数不能定义为虚函数。
多态(纯虚函数)
不定义具体实现的虚函数为纯虚函数。
纯虚函数的形式:
virtual 数据类型 成员函数名(形参表) = 0;
纯虚函数为特殊的虚函数,仅提供接口定义。因此纯虚函数也被称为接口。
注意:纯虚函数和函数体为空的虚函数是不同的。
多态(抽象类)
如果一个类中至少包含一个纯虚函数,那么这个类就是抽象类。
抽象类是类的纯粹抽象,不能用来声明对象。但是可以声明指针。
抽象类只能作为基类使用,所以又称为抽象基类。抽象基类只提供了一个框架,为一个类族建立了一个公共的接口,而接口的实现由派生类自己完成。
一个派生类必须提供基类中所有纯虚函数的实现,才能避免不会再成为抽象类。
模板(函数模板)
问题:编写一个在屏幕上输出数组的函数?
使用重载的方法:
void display_array(int* a, int n);
void display_array(float* a, int n);
void display_array(double* a, int n);
缺点:每增加一种新的类型,就要新增一个函数定义和相应的实现代码,太麻烦!
模板(函数模板)
模板(template)是一个将数据类型参数化的工具,它提供了一种将代码与数据类型相脱离的机制,即代码不受具体数据类型的影响,从而提高了代码的可重用性。
模板分为函数模板和类模板两种
ANSI标准C++库就大量使用了模板
模板(函数模板)
#include iostream.h
template typename DataType
void diaplay_array(DataType* a, int n){
cout The elements of the array is: ;
for (int i=0; in; i++){
cout a[i] , ;
}
cout endl;
}
void main(){
int a[3] = {1, 2, 3};
double b[3] = {2.0, 4.0, 6.0};
display_array(a, 3);
display_array(b, 3);
}
模板(函数模板)
在函数模板被调用的时候,编译器根据实际参数的类型确定模板参数,并自动生成对应的函数,即模板函数。模板参数不同,生成的模板函数也不同
调用函数模板时即生成函数模板的一个实例(模板函数),这个过程成为函数模板的实例化。
函数模板在编译阶段不会生成可执行代码,只有在函数模板被实例化时,才会根据实参的数据类型进行类型替换,生成一个真正的函数,然后对这个函数进行编译。
定义函数模板时可以使用多个类型参数(p112,例3-30)
template class T1, class T2, class T3
模板(类模板)
类定义时,将某些数据成员、成员函数的参数及返回值的类型参数化,相应的类就成为类模板。
类是对对象的抽象,
文档评论(0)