版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象程序设计与实践第十二讲 多态性与虚函数多态性的概念 多态性( polymorphism):是一种事物的多种形态 面向对象:向不同的对象接收到同一个消息时会产生不同的行为(即方法) C+中:具有不同功能的函数可以用同一个函数名基于对象:只支持类,而不支持多态面向对象:既支持类,又支持多态函数重载:静态多态(编译时的多态性)实践目标目标:随机选择角色FighterSoldierSaintGhost角色数组对象数组对象类型不同数组类型无法确定指针数组指向对象的指针可以相同数组类型为基类指针多态性示例/Fighter.hclass Fighterprotected: string Name;/
2、角色名称 int life;/生命值public: void Suffer(int damage);/遭受攻击 void Attack(int& boss);/实施攻击 void Surrender();/逃跑 void Init(int value);/初始化生命 int GetLife();/获取生命值 string GetName();/获取角色名称;多态性示例/Fighter.cppFighter:Fighter(void) Name = Figher; life = 100;void Fighter:Attack(int& boss) cout Oh, no.Ill do nothi
3、ng!;void Fighter:Surrender() cout You are a chicken.;多态性示例/Main.cppvoid Play() /选择角色 Fighter* roles3 = new Soldier(), new Saint(), new Ghost(); Fighter* role = rolesrand() % 3; cout Selected Role: GetName() role-Attack(boss) ;/攻击 多态性示例调用Fighter类的Attack函数DemoGame3多态性 指针role是定义为指向Fighter类型的指针 Fighter类
4、的指针可以指向其派生类的对象 role指针只能访问Fighter类的成员函数Attack()允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数虚函数程序分析虚函数 /Fighter.hclass Fighterprotected: string Name;/角色名称 int life;/生命值public: void Suffer(int damage);/遭受攻击 virtual void Attack(int& boss);/实施攻击 void Surrender();/逃跑 void Init(int value);/初始化生命 int Ge
5、tLife();/获取生命值 string GetName();/获取角色名称;虚函数关键字虚函数 调用指向对象的Attack函数使用虚函数只能声明类的成员函数为虚函数成员函数被声明成虚函数后,在同一类族中的类就不能再定义一个非virtual的、但与该函数具有相同参数表列和返回类型的同名函数声明虚函数的条件:成员函数所在的类是基类;成员函数被继承后功能可能发生变化;通过基类指针或引用访问成员函数,则该函数应当声明为虚函数一般来讲,定义虚函数只为保留该函数名静态关联和动态关联 静态关联动态关联编译时确定(早期关联)对象名访问重载或非虚函数运行时确定(滞后关联)基类指针虚函数关联关联:确定对象或指
6、针调用哪个函数静态关联和动态关联 SoldierAttack()Suffer()SaintAttack()Suffer()GhostAttack()Suffer()rolepRole虚函数与重载的比较函数重载是解决的是同一层次上的同名函数的问题。是横向重载虚函数解决的是不同派生层次上的同名函数的问题。相当于纵向重载同一类族的虚函数首部是相同的,而重载函数的首部不相同(参数表不能相同)虚析构函数 class point /定义point类public: point() point() cout 析构基类对象 endl; ;class circle : public point /由point类派
7、生circle类public: circle() circle() cout 析构派生类对象 endl; ;虚析构函数 int main() point* p = new circle; /基类对象指针指向派生类对象 delete p; return 0; 仅执行基类析构函数而未执行派生类析构函数虚析构函数 class pointpublic: point() virtual point() cout 析构基类对象 endl; ;class circle : public pointpublic: circle() circle() cout 析构派生类对象 endl; ;虚析构函数纯虚函数 Fighter类的Attack()函数没有实际意义,但其派生类都需要Attack()函数,而且功能还不相同在基类中将某一成员函数定为虚函数主要是为预留函数名,具体功能留给派生类根据需要定义程序深入分析纯虚函数virtual void Attack(int& boss) = 0;纯虚函数 如果基类中声明了纯虚函数,但派生类中没有定义该函数,则该虚函数在派生类中仍为纯虚函数纯虚函数的作用是在基类中为其派生类保留函数的名字,否则无法实现多态性纯虚函数没有函数体纯虚函数的声明形式virtual 函数类型 函数名(参数表) = 0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版智能交通解决方案合同
- 2025年粗纺混纺纱行业深度研究分析报告
- 2024-2029年中国微电声器件行业市场研究与投资预测分析报告
- 全电子时控开关钟行业行业发展趋势及投资战略研究分析报告
- 2025年度个人教育培训贷款延期合同4篇
- 2025年山西华新燃气集团有限公司招聘笔试参考题库含答案解析
- 2025年山东海洋冷链发展有限公司招聘笔试参考题库含答案解析
- 二零二五版门卫劳务与城市安全服务合同4篇
- 2025年江苏海晟控股集团有限公司招聘笔试参考题库含答案解析
- 2025年辽宁鞍山市台安县城建集团招聘笔试参考题库含答案解析
- 冷库存储合同协议书范本
- AQ/T 4131-2023 烟花爆竹重大危险源辨识(正式版)
- 武术体育运动文案范文
- 设计服务合同范本百度网盘
- 2024年市级专科护士理论考核试题及答案
- 肺炎临床路径
- 供应商供货服务方案(2篇)
- JB∕T 3077-2019 汽轮机图形符号
- 《药物临床试验机构备案评估指南及检查细则(试行)》
- 河北省2022年中考数学真题及答案
- 氨水安全技术说明书msds
评论
0/150
提交评论