- 1、本文档共21页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章多态性与虚函数概要
第11章 多态性与虚函数 主要内容 绑定方式与多态性 虚函数 纯虚函数与抽象类 1、绑定方式与多态性 绑定(binding):将名字与它的含义相关联的过程(例如,将函数调用与函数体对应) 早期绑定(静态绑定) 在编译阶段完成 缺省的函数调用方式(非虚函数使用) 晚期绑定(动态绑定) 在运行阶段完成 虚函数使用的绑定方式 1、绑定方式与多态性(续) 多态性(polymorphism):程序中的同一名字(或符号)在不同情况下有不同解释 方法和函数具有相同的名字,但有不同的行为 同样的消息被不同类型的对象接收时有可能导致完全不同的行为 多态性的两种基本形式 编译时多态性 在编译阶段确定名字的含义 通过函数重载和类属机制实现 运行时多态性 在运行阶段确定名字的含义 由继承结合虚函数的动态绑定实现 运行时多态性是面向对象程序设计的重要特征之一 1、绑定方式与多态性(续) 获得运行时多态性需同时满足的条件: 要有一个继承层次 在基类中要定义虚函数 在派生类中要对基类中定义的虚函数进行重定义 要通过基类指针(或基类引用)来调用虚函数 多态性的作用 获得表示的独立性 对语义相似的操作或函数采用同一标识符进行命名,使得程序的表达方式更为自然 应对需求变化 使得在需求发生变化的时候,对程序做最少的修改即可适应新情况 2、虚函数 虚函数(virtual function):类定义体中使用保留字virtual声明的成员函数 主要作用:与继承机制相结合,实现运行时多态性 构造函数不能指定为虚函数 static成员函数不能指定为虚函数 例1:虚函数的动态绑定 例1:虚函数的动态绑定(续) 例1:虚函数的动态绑定(续) 注意 “一旦为虚,永远为虚” 在类定义体外部出现的成员函数定义上不能用virtual 问题 如果去掉上例中基类Base的成员函数showName声明中的virtual保留字,则运行该程序的输出会是怎样? 答案 例2:通过基类引用实现虚函数的动态绑定 使用虚函数的特定版本 3、纯虚函数与抽象类 纯虚函数(pure virtual function):在基类中声明的虚函数,但在基类中没有定义函数体,要求所有派生类都必须定义自己的版本 声明纯虚函数的一般形式: virtual 返回值类型 函数名(形参表) = 0; 纯虚函数的作用: 指明在基类中无法给出某个虚函数的定义 限制不能创建该类(包含纯虚函数的类)的对象 3、纯虚函数与抽象类(续) 3、纯虚函数与抽象类(续) 抽象类(abstract class):包含纯虚函数的类 抽象类的特性 只能用作其他类的基类 不能用于直接创建对象实例 不能用作函数的形参类型、返回类型 不能用于强制类型转换 可声明抽象类的指针和引用 3、纯虚函数与抽象类(续) 例如: Account *ptr; √ Account fun3(Account a); √ Account x; ? Account fun1(int); ? void fun2(Account a); ? 4、应用举例:企业工资管理程序 根据工作记录文件中的数据计算雇员工资 4、应用举例:企业工资管理程序 类图 * * C++语言程序设计 中山大学信息科学与技术学院 #include iostream using namespace std; class Base { public: virtual void showName( ) { cout Base class endl; } }; class DClass1: public Base { public: void showName( ) // 继承成员的重定义 { cout The first derived class endl; } }; class DClass2: public Base { public: void showName( ) // 继承成员的重定义 { cout The second derived class endl; } }; void main( ) { Base bObj; DClass1 d1Obj; DClass2 d2Obj; Base *ptr; // 定义指向基类的指针 ptr = bObj; ptr - showName(); ptr = d1Obj; // 基类指针指向派生类对象 ptr - showName(); ptr = d2Obj; // 基类指针指向派生类对象 ptr - showName(); } 程序运行结果:
您可能关注的文档
- 煤矿机电运行队机电质量标准化标准.doc
- 第10课五四爱国运动.ppt
- 第10课民国时期民族资本主义的曲折发展).ppt
- 煤矿电工学3章.ppt
- 煤矿井下供电系统的三保护.ppt
- 煤矿电工培训课件.ppt
- 第10课中国民族资本主义的曲折发展.ppt
- 第10课秦王扫六合杨琦.ppt
- 煤矿机电安全基础知识.ppt
- 第11章.群体沟通与群体决策.ppt
- 2025届衡阳市第八中学高三一诊考试物理试卷含解析.doc
- 2025届湖南省娄底市双峰一中等五校重点中学高三第二次诊断性检测物理试卷含解析.doc
- 天水市第一中学2025届高三第二次联考物理试卷含解析.doc
- 2025届金华市重点中学高三考前热身物理试卷含解析.doc
- 2025届北京市石景山区第九中学高三第四次模拟考试物理试卷含解析.doc
- 江苏扬州市2025届高三第一次模拟考试物理试卷含解析.doc
- 2025届江苏省南通市高级中学高考物理五模试卷含解析.doc
- 广东省清远市华侨中学2025届高三第一次调研测试物理试卷含解析.doc
- 辽宁省凤城市2025届高三第五次模拟考试物理试卷含解析.doc
- 内蒙古巴彦淖尔市重点中学2025届高考仿真卷物理试卷含解析.doc
文档评论(0)