- 1、本文档共78页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章虚函数与多态性
第8章 虚函数与多态性 ;主要内容;8.1 向上类型转换;面向基类编写程序;一组employee类/通用payroll()函数;代码中类层次如下图所示;payroll()函数具有很强的适应性;问题;8.2 虚函数;8.2.1 函数调用绑定;晚绑定;8.2.2 虚函数;上面的代码可以修改为如下形式;上面的代码可以修改为如下形式;上面的代码可以修改为如下形式;多态性;图形类计算面积;图形类计算面积;8.2.3 虚函数的相关规则;例子;例子;例子;例子;虚函数和构造/析构函数;为什么析构函数最好声明为虚函数;为什么析构函数最好声明为虚函数;8.2.4 实现多态性的步骤;8.2.4 实现多态性的步骤;例子;例子;例子;程序的运行结果如下;注意事项;注意事项;8.2.5 动态绑定的实现;8.2.5 动态绑定的实现;8.2.5 动态绑定的实现;对象的布局;对象的布局;VTABLE;VTABLE例子;VTABLE例子;编译器创建的VTABLE和VPTR;实现动态绑定;派生类中的虚函数;回顾构造函数的行为;8.3 抽象类;8.3 抽象类与纯虚函数;抽象类两个有主要用途;纯虚函数;Shape类;Shape类层次;使用抽象类要注意以下几个方面;使用抽象类要注意以下几个方面;使用抽象类要注意以下几个方面;使用抽象类要注意以下几个方面;使用抽象类要注意以下几个方面;使用抽象类要注意以下几个方面;8.4 RTTI;8.4.1 dynamic_cast与向下类型转换;可以看到,同样的基类指针到派生类指针的类型转换,其安全性不同。当基类指针指向派生类对象时,向下类型转换是安全的;如果基类指针指向基类对象或者不同派生类的对象,那么这种向下类型转换就是危险的。指针指向的对象到底是什么类型只有在程序运行期间可以获知,因而需要运行时刻的类型信息才能判断是否可以安全地转换,并真正实施转换。 ;显式类型转换dynamic_cast可以用来把一个类类型对象的指针转换成同一类层次结构中的其他类的指针,同时也可以把一个类类型对象的左值转换为同一类层次结构中其他类的引用。和其他显式转换不同的是,dynamic_cast是在运行时刻执行的。如果指针或左值操作数不能被安全地转换为目标类型,则dynamic_cast将失败。如果是对指针类型的dynamic_cast失败,则dynamic_cast的结果是空指针,即0。如果针对引用类型的dynamic_cast失败,则dynamic_cast会抛出一个bad_cast类型的异常。 ;//一组表示公司不同雇员的类,其中包含一些计算工资的操作
class employee {
public:
virtual int salary();
};
class manager : public employee {
public:
int salary();
};
class programmer : public employee {
public:
int salary();
};
void company::payroll( employee *pe ) {
//公司发放工资的操作
pe - salary();
};利用类层次和虚函数salary()提供的多态性,payroll()能够实现对不同类型雇员的工资发放。
假设公司在年终时根据工作业绩,决定向所有的程序员发奖金,并且用一个bonus()操作计算和发放每个程序员的奖金。显然,bonus()作为programmer的成员函数比较合适。可引起的问题是,如何在payroll中调用bonus()呢?;一种解决方案是将bonus()作为基类employee的虚函数,并提供一个默认实现,然后在programmer中根据奖金的发放办法重写bonus(),其他类只要继承基类中的实现即可。这样在payroll()就可以调用bonus()了。
这个方案看似简单直接,实际上存在几个问题:第一,修改员工类层次中的基类employee会影响整个类层次,这在面向对象设计中是应该尽量避免的。第二,向基类增加的虚函数实际上只对programmer的,将它放在基类接口中会被很多不需要它的派生类继承。第三,对基类的修改会引起整个类层次代码的重新编译。如果因为某些原因不能得到类层次的源代码,比如这是公司购买的系统,那么这个方案将是不可行的。;另一个方案是不增加虚函数,而将bonus()操作放在需要它的programmer类中。即使没有programmer的源代码,我们也可以在programmer类定义的头文件中增加bonus()成员函数,然后增加一个源文件来定义这个成员函数:
//programmer的头文件
class programmer : public employe
您可能关注的文档
- 第五章数组、字符串、指针.ppt
- 第五章文字处理系统[Word2003].ppt
- 第五章文字处理word2003.ppt
- 第五章机械参量的测试_2.ppt
- 第五章园林工程材料与构造.ppt
- 第五章构造数据类型.ppt
- 第五章接触测温方法的讨论.ppt
- 第五章地球水环境2.ppt
- 第五章构造数据类型2.ppt
- 第五章树和二叉树ss.ppt
- 浙江省县域教研联盟2024-2025学年高三上学期12月模拟考试技术试题-高中信息技术2.docx
- 湖南省岳阳市云溪区2024-2025学年高三上学期11月期中地理试题.docx
- 浙江省杭州市北斗联盟2024-2025学年高一上学期期中联考政治试题2.docx
- 广东省肇庆市实验中学高三理科化学第16周限时训练.doc
- 黑龙江省牡丹江市第一高级中学2024-2025学年高一上学期11月期中地理试题2.docx
- 云南省玉溪市峨山一中2017-2018学年高二四月份月考生物试题.doc
- 山东省实验中学高三第三次诊断考试历史试题.docx
- 山东省菏泽第一中学2024-2025学年高二上学期第一次月考历史试题含答案.docx
- 山东省菏泽市2024-2025学年高一上学期11月期中数学试题(A)含解析.docx
- 安徽省六安市舒城中学高三仿真(一)文科综合试题.doc
最近下载
- 2021-2022学年浙江省台州外国语学校高三(下)开学语文试卷(附答案详解).docx
- 2024年北京东城初三二模英语试卷及答案.pdf VIP
- 长园深瑞(深圳南瑞)ISA-353G说明书.pdf
- 实用英语教学法教程教学课件-Chapter 2 Approaches and methods in language teaching.pptx VIP
- 部编版《道德与法治》八年级下册教材分析.pdf VIP
- 2025年宿迁市公需考试试题.docx
- 50MWp光伏电站项目施工总进度计划.doc
- 全球LCD光阻剂市场调查与前景分析2024年.docx VIP
- 公路工程预算定额(JTGT3832-2018).docx
- 小学六年级下册数学 期末测试卷附答案(b卷).docx
文档评论(0)