面向对象程序设计 PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
【例5-3】示例类型兼容规则的应用。 教材P261,该程序的运行结果为:
Base class Base class Base class Derivel class Derive2 class
2018/8/8 第5章多态与抽象类 10
根据类型兼容规则,基类指针p可以指 向派生类对象obj2、obj3(即派生类 对象可以代替基类对象,给基类指针 赋值),但编译时,编译器根据p的类 型是基类型,自动调用基类的who(), 所以结果如上所示。
2018/8/8
第5章多态与抽象类
3
分析问题
基类设置成员函数Pay()和Display() 的目的是为了统一规定类簇的基本行 为,虽有冗余,但也必要。为此,C++ 提供了纯虚函数来解决此问题。
2018/8/8
第5章多态与抽象类
4
在主函数中建立了4个不同类的对象,进行 了类似的操作,重复写了4遍类似的语句。 应该怎样有效地来处理它们同样的行为呢 ?我们首先想到的是用循环解决,但调用 这些同名函数的对象却不相同。 分析这些对象有一个共同点,那就是来自 于同一个基类,而基类与派生类对象有什 么关系呢?事实上,它们遵循类型兼容规 则。
21
在派生类中重新定义虚函数时,其函 数原型包括返回类型、函数名、参数 个数与参数类型的顺序,都必须与基 类中的原型必须相同。
2018/8/8
第5章多态与抽象类
22
一个函数一旦被声明为虚函数,则无 论声明它的类被继承了多少层,在每 一层派生类中该函数都保持虚函数特 性。因此,在派生类中重新定义该函 数时,可以省略关键字virtual。但是 ,为了提高程序的可读性,往往不省 略。
2018/8/8 第5章多态与抽象类 5
Employee *emp[4]={&m1,&t1,&s1,&sm1}; //声明 抽象类指针数组 for(int i=0;i<4;i++) { emp[i]->Pay(); //单一指令,实现多态, 计算指针指向对象的工资 emp[i]->Display();//单一指令,实现多态, 输出指针指向对象的信息 }
《面向对象程序设计》
第 5章 多态与抽象类
内容提要
5.1 类层次的多态问题
5.2
5.3
类型兼容规则(重点)
多态的概念
5.4
5.5
多态的分类
联编
5.6
5.7
虚函数(重点)
抽象类与纯虚函数(重点)
提出问题
【例5-1】在例4-1程序中存在的两个 不足:
(1)基类Pay()和Display()的函数体均为空, 在实现部分仍要写出函数体,显得冗余。 (2)在主函数中,建立了4个不同类的对象, 进行了类似的操作,重复写了4遍类似的语句 ,程序不够简洁。
静态联编 动态联编
2018/8/8 第5章多态与抽象类 15
静态联编是在编译阶段完成的联编。 例5-2、例5-3及以前的函数重载都是 采用静态联编方式。 例5-4,教材P265,是静态联编。 动态联编是在运行阶段完成的联编。
2018/8/8
第5章多态与抽象类
16
在例5-4中,静态联编把基类指针ps指 向的对象绑定到基类上,而在运行时 进行动态联编将把ps指向的对象绑定 到派生类上。
2018/8/8
第5章多态与抽象类
11
【思考题5-3】如果基类指针要访问派 生类的who(),怎么办? C++提供了多态机制来解决这个问题。 类型兼容规则是C++多态的重要基础。
2018/8/8
第5章多态与抽象类
12
多态
多态(Polymorphism)是指具有相似 功能的不同函数使用同一个名称来实 现,从而可以使用相同的调用方式来 调用这些具有不同功能的同名函数的 特性。
2018/8/8
第5章多态与抽象类
13
5.4
多态的分类
C++支持的多态可以分为四种类型:
重载多态:函数重载和运算符重载 强制多态:强制类型转换 包含多态:虚函数 参数多态:函数模板和类模板
2018/8/8
第5章多态与抽ຫໍສະໝຸດ Baidu类
14
联编
联编是指把一个标识符名和一个存储 地址联系在一起的过程。即函数调用 与某个函数在多态的实现过程中,确 定调用哪个同名联系的过程,又称绑 定。分为:
2018/8/8
第5章多态与抽象类
19
5.6 虚函数
虚函数就是在基类中被关键字virtual 说明、并在一个或多个派生类中被重 新定义的成员函数。
2018/8/8
第5章多态与抽象类
20
声明虚函数的格式如下:
virtual <函数值类型> <函数名>(<参数表>);
2018/8/8
第5章多态与抽象类
2018/8/8
第5章多态与抽象类
8
类型兼容规则中所指替代包括以下情 况:
(1)派生类的对象可以赋值给基类的对象。 (2)派生类的对象可以初始化基类的引用。 (3)派生类的对象的地址可以赋值给基类的指 针变量。
在替代之后,派生类对象就可以作为 基类的对象使用,但只能访问从基类 继承的成员。
2018/8/8 第5章多态与抽象类
2018/8/8
第5章多态与抽象类
17
可见,同一个指针,在不同阶段被绑 定的类对象将是不同的,进而被关联 的类成员函数也是不同的。 如何来确定是用静态联编还是用动态 联编呢? C++规定,动态联编通过继承和虚函数 来实现。
2018/8/8 第5章多态与抽象类 18
虚函数是动态联编的基础。下面介绍 虚函数。
2018/8/8 第5章多态与抽象类 23
在程序运行时,不同类的对象调用各 自的虚函数,这就是运行时多态。
2018/8/8
第5章多态与抽象类
24
【例5-5】将例5-4基类的成员函数 print()设为虚函数,采用对象指针调 用虚函数,进而实现动态联编。
2018/8/8
第5章多态与抽象类
25
该程序的运行结果为:
2018/8/8 第5章多态与抽象类 6
5.2类型兼容规则
类型兼容规则是指在需要基类对象的 任何地方,都可以使用公有派生类的 对象来替代。
2018/8/8
第5章多态与抽象类
7
通过公有继承,派生类得到了基类中 除构造函数、析构函数之外的所有成 员。这样,公有派生类实际就具备了 基类的所有功能,凡是基类能解决的 问题,公有派生类都可以解决。