已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,第8章多态性与虚函数,本章内容,多态性概述运算符重载虚函数及动态多态性,1.多态性概述,多态性是面向对象程序设计的一个重要特征。,多态性:是指发出同样的消息被不同类型的对象接收时而导致不同的行为。多态是指类中具有相似功能的不同函数使用同一个名称。当调用这个相同名称的函数时,可根据需要完成不同的功能.,从实现时机方面讲,多态性可以分为:静态多态性动态多态性静态多态性:指可在编译期间确定的多态性。静态多态性:函数重载运算符重载动态多态性:指在程序在运行过程中,才能确定的多态性。,1.多态性,静态多态性:1)函数重载:几个函数具有相同的名字,但函数参数的个数或类型不同。重载的函数可以是:一般函数类中的成员函数、构造函数,例题:构造函数重载:#includeclassclassApublic:classA()a1=0;a2=0;cout”defaultn”;classA(inti,intj);voidprint()couta1”,”a2endl;A()cout”destructuren”;private:inta1,a2;classA:classA(inti,intj)a1=i;a2=j;cout”constructuren”;voidmain()classAob1,ob2(12,8);ob1.print();ob2.print();,#include#includeclassstringpublic:string(char*pa);voidprint()coutpstrendl;voidprint(char*str)coutstrendl;private:char*pstr;string:string(char*pa)pstr=newcharstrlen(pa)+1;strcpy(pstr,pa);voidmain()strings1(“programming”);s1.print();s1.print(“C+”);,成员函数重载例题:,运算符重载:将已有的运算符赋予新的含义。不可重载的运算符“”圆点运算符“*”成员指针选择运算符“”域分辨运算符“?:”条件运算符“sizeof”长度运算符除以上五个运算符外,其余运算符均可重载,2.运算符重载,重载运算符的规则:只能重载C+中已有的可重载的运算符,不能建立新的运算符;重载运算符时不能改变原运算符操作数的个数、原有运算符的优先级和结合性,也不能改变原运算符对于内部基本类型对象的含义;如果重载了某个运算符(如“=”),并不意味着重载了相关的运算符(如“+=”、“-=”等);,运算符重载:,运算符重载函数的实现:可以利用:成员运算符函数友元运算符函数学习时注意:不同的实现方法,参数的个数不同。,运算符重载:,用类的成员函数的格式如下:class类名.返回类型operator运算符(形参表);.;,运算符重载:,例:利用成员函数实现两个复数相加运算,程序说明:成员函数complexoperator+(constcomplex.;,运算符重载:,由于友元函数被调用时没有隐含指向当前对象的this指针作实参,所以,一个一元运算符重载为类的友元函数时,其参数个数为1,一个二元运算符重载为类的成员函数时,其参数个数必须为2。,运算符重载:,例:利用友元函数实现两个复数相加运算,程序说明:友员函数friendcomplexoperator+(constcomplexpublic:count(inti,intj)a=i;b=j;voidshow()couta“b”只能选择用成员函数;对于复合赋值运算符“+=、-=、/=、*=”等常常选择用成员函数。对于其他运算符,如“+、-、*、/”等常常选择用友元函数,以适应更多的计算形式,运算符重载:,例如,对于复数类对象相加来说,用友元函数实现时,表达式4.5+c1可以正确计算,将被解释成operator+(complex(4.5),c1)。而用成员函数实现时,表达式4.5+c1将是一个错误的表达式,因为若将以上加法重载为成员函数时,表达式4.5+c1将被解释为4.5.operator+(c1),而4.5是一个基本类型的常数,不能自动转换为复数类对象。,运算符重载:,使用说明:,3.虚函数与动态多态,虚函数是一种成员函数,而且是非static的成员函数。一个函数被说明或定义为虚函数后,说明表示它在派生类中可能有多种不同的实现。虚函数只能通过指针或引用所表示的对象来调用。构造函数不允许为虚函数,但析构函数允许为虚函数,以便能自动释放由指针或引用所表示的对象。,例:不使用虚函数的静态联编示例。,结果:000,虚函数:,基类对象与派生类对象之间的赋值兼容性表现在:把派生类对象赋给基类对象Aa1;Bb1;a1=b1;用派生类对象向基类对象的引用赋值或初始化Aa1;Bb1;,例:动态联编示例。,程序说明:各派生类中重定义的虚函数仍是虚函数,不管是否有virtual。虚函数的调用在main()中定义指向根基类的指针p可以指向派生类对象。在执行过程中,可根据指针p的当前指向而调用相应类的虚函数,从而实现动态的多态性。,虚函数:,虚函数是类中的成员函数。虚函数的一般格式如下:virtual类型名函数名(形参表)函数体,一个函数被说明或定义为虚函数后,表明它在派生类中可能有多种不同的实现,即重新定义。在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数和类型以及各参数顺序,都必须与基类中的原型完全相同。否则,将处理为静态联编。,虚函数说明:,上例函数fun()的形参也可以是如下形式:voidfun(Point,虚函数:,虚析构函数构造函数不允许说明为虚函数,但可以说明虚析构函数其形式为:virtual类名()虚析构函数体,如果一个类的析构函数为虚函数,则由它派生而来的所有派生类的析构函数均为虚析构函数定义了虚析构函数后,可实现动态联编,根据当前指针的指向调用适当的析构函数释放对象一般用delete运算符删除动态分配的对象,例:虚析构函数使用示例。,虚函数:,纯虚函数与抽象类纯虚函数的形式为:(函数体为0)virtual类型名函数名(形参表)=0;,有纯虚函数的类称为抽象类。,有纯虚函数的类称为抽象类,只能作为其他类的基类(即根基类)使用,不能定义抽象类的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 常见蛋白原料的特性与营养构成总结
- 八年级英语下册 Unit 5 单元自测· 湖北省卷专用(试题版A3)
- 工业基础技术 8
- ktv小食外包合同
- 上海财务外包合同
- 东莞邮政局外包合同
- 产品组装外包合同
- 代驾外包合同
- 众创空间外包合同
- 催收公司外包合同
- 2026山东威海热电集团有限公司招聘44人笔试参考试题及答案解析
- 2026年备考中国电信笔试解题思路与答题技巧
- 汽车检测站消防制度
- 第七单元跨学科实践活动6调查家用燃料的变迁与合理使用课件九年级化学人教版(2024)上册
- 动车组网络控制系统-CRH2A、CRH380A型动车组网络控制系统
- 《外汇交易实务》期末考试题库
- (高清版)TDT 1054-2018 土地整治术语
- 北京长城的历史简介和资料500字
- 中药注射剂使用管理制度
- 河南科来福化工有限公司年产900吨医药中间体项目环境影响报告书
- 注册测绘师《测绘综合能力》题库(660题)
评论
0/150
提交评论