- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第5章多态;第5章多态;5.1.1多态概述;2.多态的类型
OOP中广义的多态通常有3种表现形式
重载多态:包括函数重载和运算符重载;
模板多态:通过一个模板生成不同的函数或类(第7章介绍);
继承多态:通过基类对象的指针(引用),调用不同派生类对象的重定义同名成员函数,表现出不同的行为。一般情况下,多态即指这种类型。
实际意义上的多态是指继承多态!
;3.实现多态的条件
要实现继承多态性,须具备三个必要条件:
要有继承;
派生类要覆盖(重定义)基类的虚函数,即派生类具有和基类函数据原形完全相同的虚成员函数;
把基类的指针或引用绑定到派生类对象上。
也就是说,没有继承,或者没有派生类没有重定义基类的虚函数,或者具备前两者,但直接把派生类对象赋值给基类对象(没有通过指针或引用),都不能实现多态。;【例5-1】设计一个管理动物声音的软件。
(1)问题分析
所有的动物都会发声,但是当没有说明是猫,狗或鸟等具体动物时,则不知道它发出什么声音。
虽然无法实施,但又确实知道动物有声音,面向对象程序设计语言提出了用(纯)虚函数来表达这类确实存在但又无法实施的抽象概念。
当到了可知的具体动物时,它会发出什么声音就是明确的了,此时再对相应的虚函数进行编码实现。
;(2)数据抽象
用Animal表示动物类,用虚成员函数sound表示动物会发声这一行为。
Dog,Cat,Wolf,Bird则是具体的动物,它们可以继承Animal的所有特征和行为。
每类动物能够发出什么声音是明确的,而且各不相同,需要覆盖(重定义)从Animal继承来的sound成员函数。
Animal和Dog等动物的继承关系形成了图5-1所示的继承层次结构
;动物继承体系;5.1.1多态的概念;(3)Anmal的多态实现
多态是指当基类的指针(或引用)绑定到派生类对象上,通过此指针(引用)调用基类的成员函数时,实际上调用到的是该函数在派生类中的覆盖函数版本。
例如,对于上面的继承结构,下面的pA指针实现的就是多态。
voidmain(){
Animal*pA;
Dogdog;
Catcat;
Wlofwlof;
pA=dog;pA-sound();//pA调用Dog的sound函数
pA=cat;pA-sound(); //pA调用Cat的sound函数
pA=wlof;pA-sound(); //pA调用Wlof的sound函数
}
;更一般地,多态更多地体现在用基类对象的指针或引用作为函数的参数,通过它调用派生类对象中的覆盖函数版本。
例如,针对Animal继承体系,设计animalSound函数管理每种动物的声音,多态能够很好地实现此需求。
voidanimalSound(Animalanimal){animal.sound();}
animalSound函数体现了“一个接口,多种实现”。
即以基类Animal的引用为接口,可以访问到图5-1所示继承体系中Animal类的任何派生类对象的sound函数。
Animal*pA;
Dogdog;Catcat;Wlofwlof;
animalSound(dog);//调用Dog::sound()
animalSound(cat);//调用Cat::sound()
animalSound(wlof);//调用Wlof::sound()
;5.1.2多态的意义;5.1.3多态与联编;3、静态联编
静态联编又称静态绑定,是指在编译程序时就根据调用函数提供的信息,把它所对应的具体函数确定下来,即在编译时就把调用函数名与具体函数绑定在一起。
4、动态联编
动态联编又称动态绑定,是指在编译程序时还不能确定函数调用所对应的具体函数,只有在程序运行过程中才能够确定函数调用所对应的具体函数,即在程序运行时才把调用函数名与具体函数绑定在一起。
;4、多态性的实现方式
编译时多态性:---静态联编(连接)----系统在编译时就决定如何实现某一动作,即对某一消息如何处理。静态联编具有执行速度快的优点。
在C++中的编译时多态性是通过函数重载和运算符重载实现的。
运行时多态性:---动态联编(连接)----系统在运行时动态实现某一动作,即对某一消息在运行过程实现其如何响应。动态联编为系统提供了灵活和高度问题抽象的优点。
在C++中的运行时多态性是通过继承和虚函数实现的。;关于派生类和基类关系的说法正确的是()。;5.2虚函数;5.2.1虚函数的意义;(2)数据抽象
雇员类Employee,用name和Id分别表示姓名和身份证编号;
您可能关注的文档
最近下载
- 2022年国家公务员考试行测试题(有答案)(地市级).pdf VIP
- CISA考试练习习题库(2025年第1部分).pdf VIP
- 基于核心素养的小学语文作业设计策略分析.docx VIP
- T_CGSS 014—2020_老年人跌倒风险综合评估规范.pdf VIP
- 选区激光熔化技术下成形件表面质量及残余应力预测方法.pdf VIP
- 机电设备安装应急处理预案.docx VIP
- 2025入党积极分子发展对象考试题库(含答案).docx VIP
- 个人简历——【标准模板】.doc VIP
- [富士康 索尼设备校正]SI-F209 Operation Manual (中文版).pdf
- 小学语文作业设计的有效策略.doc VIP
文档评论(0)