- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多态性和虚函数
一、多态性的概念
多态性(polymorphism)是面向对象的一个重要特征。顾名思义,多态的意思
就是一个事物有多种形态。在面向对象方法中一般是这样表述多态性的:向不同
的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。
在C++ 中,多态性的表现形式之一是:具有不同功能的函数可以用同一个函
数名,这样就可以实现用一个函数名调用不同内容的函数。因此,函数重载、运
算符重载都是多态现象。
从系统角度看,多态性分为两类:静态多态性和动态多态性。静态多态性是
通过函数重载实现的。由函数重载和运算符重载形成的多态性称为静态多态性是
因为在编译时就知道调用函数的全部信息,因此,在程序编译时系统就能决定调
用哪个函数,所以静态多态性又称为编译时的多态性。静态多态性的函数调用速
度快、效率高,但缺乏灵活性,在程序运行前就已经决定了执行的函数和方法。
动态多态性的特点是:不在编译时确定调用哪个函数,而在程序运行过程中
才动态的确定操作所针对的对象。因而又称为运行时的多态性。动态多态性是通
过虚函数(virtual function)实现的。
二、一个典型的例子
例:先建立一个Point 类,包含数据成员x,y(坐标点)。以它为基类,派
生出一个Circle 类,增加数据成员半径r;在以Circle 类为基类,派生出一个
Cylinder 类,增加数据成员高h,要求编写程序,重载运算符“”和“”使
之能用于输入和输出以上对象。
图1:承上启下的典型例子
三、利用虚函数实现动态多态性
1、虚函数的作用
C++ 中虚函数是用来解决动态多态问题的。所谓虚函数,就是在基类声明函
数是虚拟的,并不是实际存在的函数,然后在派生类中才正式定义此函数。在程
序运行期间,用指针指向某一派生类对象,这样就能调用指针指向的派生类对象
中的函数。虚函数的作用就是允许在派生类中重新定义与基类同名的函数,并且
可以通过基类指针或引用来访问基类和派生类中的同名函数。
例:当基类和派生类中有同名函数且不使用虚函数,其程序如图2 所示。
图2:基类和派生类中有同名函数
分析程序运行结果发现,对象grad 的数据成员并没有被全部输出,说明在
需要输出grad 对象的数据成员时并没有调用Graduate 类的display 函数,而是
调用了父类Student 中的display 函数。这是因为基类指针本来是用来指向基类
对象的,如果用它来指向派生类对象就会自动进行指针类型转换,将派生类对
象的指针先转换为基类的指针,这样基类指针实际上指向的是派生类对象中的
基类部分。所以会出现这样的结果。
如果在Student 类中声明display 函数时加上关键字virtual,将Student
中的display 函数声明为虚函数,则运行结果如图3 所示。
图3:将基类中的display 函数声明为虚函数后的运行结果
分析结果可以发现,现在用同一个指针变量(指向基类对象)不但输出了
stud 对象中的全部数据,而且还输出了 grad 对象中的全部数据,当然如果
Student 类的其他派生类中还有同名函数display,同样可以用这个指向基类对
象的指针输出其他派生类对象中的所有成员。这是因为把基类的某个成员函数声
明为虚函数后,允许在其派生类中对该函数重新定义,赋予新的功能,并且可以
通过指向基类对象的指针指向同一类族中不同类的对象,从而调用其中的同名函
数。这样,就达到了同一类族中的不同类的对象,对同一函数调用做出不同响应
的效果,这就是动态多态性。
2、虚函数的使用方法
(1)在基类中用virtual 声明为虚函数,如果在类外定义不必再加virtual;
(2)在派生类中重新定义此函数,函数名、函数类型、函数参数类型和个数必
须与虚函数相同,然后根据派生类的需要重新定义函数体。(注:当一个成员函
数被声明为虚函数后,其派生类中的同名函数都自动称为虚函数。在派生类中
重新声明该虚函数时,为了使程序更加清晰,建议加上 virtual);(3)定义一
个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象;(4)
通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数;
值得注意的是:函数重载和虚函数处理的都是同名函数问题,他么的不同之处在
于函数重载处理的是同一层次上的同名函数问题,而虚函数处理的是不同派生
层次上的同名函
您可能关注的文档
- 汇编语言子程序设计资料.ppt
- 第1章 20130702VB+VBA期末考卷.doc
- 武汉东湖水体异味物质和其和水环境因子相互关系.pdf
- 会计委派制利弊资料.doc
- 第7章 数据结构作业答案(大连理工大学).pdf
- 基于多尺度对比度塔的图像融合方法与性能评价.pdf
- 第8讲:图的基本概念和算法.ppt
- 数据结构导论-副本.pdf
- 集合Collection要领.pptx
- 高英第二册课文翻译和词汇.doc
- 职业技术学院2024级工业机器人技术(安装与维护)专业人才培养方案.docx
- 职业技术学院2024级应用化工技术专业人才培养方案.pdf
- 职业技术学院2024级软件技术(前端开发)专业人才培养方案.pdf
- 职业技术学院2024软件技术专业人才培养方案.docx
- 职业技术学院2024级信息安全技术应用(安全运维)专业人才培养方案.docx
- 职业技术学院2024级新能源汽车检测与维修技术(车辆鉴定与评估)专业人才培养方案.pdf
- 职业技术学院2024级石油炼制技术专业人才培养方案.pdf
- 职业技术学院2024级环境监测技术专业人才培养方案.docx
- 职业技术学院2024级汽车制造与试验技术专业人才培养方案.pdf
- 职业技术学院2024级信息安全技术应用专业人才培养方案.pdf
文档评论(0)