




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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学年七年级数学第一学期期末教学质量检测试题含解析
- 广东文理职业学院《法律文献检索与论文写作》2023-2024学年第一学期期末试卷
- 南昌师范学院《快题设计景观》2023-2024学年第一学期期末试卷
- 江苏省淮安市三树镇蒋集九一贯制学校2024年七年级数学第一学期期末预测试题含解析
- 公路货运行业2025数字化转型与智能化配送效率报告
- 公路货运行业数字化转型中的物流园区智慧物流系统建设与运营报告
- 智能电网建设下的卫星物联网数据存证解决方案探讨
- 企业家创业经历与管理智慧分享记录
- 形体礼仪教学培训课件
- 油田设备资产管理办法
- 动火切割安全协议书
- 免疫药物的处方审核思路与用药指导
- 《空压机节能技术及应用》课件
- 2025-2030年中国塑料制品行业产销需求及投资前景预测研究报告
- 2025年留置辅警面试题目及答案
- 工伤预防培训
- 呼伦贝尔农垦集团有限公司招聘考试真题2024
- 陕投集团招聘笔试真题答案下载版
- 设备管理考试题及答案
- 《教育强国建设规划纲要(2024-2035)》解读与培训
- 2023年高考真题-物理(广东卷) 含答案
评论
0/150
提交评论