第8章 虚函数与多态性
第8章 虚函数与多态性
主要内容1 8.1 向上类型转换 2 8.2 虚函数 3 8.3 抽象类 4 8.4 RTTI
5 8.5 类层次设计的例子 6 8.6 小结
8.1 向上类型转换
1 向上类型转换
2 虚函数3 抽象类 4 RTTI 5 类层次设计的例子 6 小结
替代原则在C++中通过向上类型转换实现, 可以将一个公有派生类的对象或地址作为基 类对象或地址来处理。 派生类向上转换为基类类型,这在逻辑上是 合理的,在物理上也是安全的。 在逻辑上方面,派生类继承基类的公共接口,能 够发送给基类对象的消息也能够发送给派生类对 象。派生类是特殊的基类类型,派生类对象(或 地址)可以作为基类的实例(或地址),替代基 类对象(或地址)使用。 在物理方面,基类的成员被派生类继承,在派生 类对象中封装着一个无名的基类子对象,派生类 对象的存储空间中从首地址开始存放的的这个基 类子对象。因此,进行向上类型转换时,通过派 生类对象切片,能够提供足够的基类信息,得到 基类对象。而使用基类指针(或引用)指向派生 类对象时也不会破坏指针(或引用)的指向规则。
面向基类编写程序 1 向上类型转换
2 虚函数3 抽象类 4 RTTI 5 类层次设计的例子 6 小结
使用继承和替代原则对于改善 代码的结构意义非凡。相对于 各种特殊的派生类而言,基类 更加抽象,更具一般性。相对 于继承层次中比较稳定的上层 类,低层派生类更容易发生变 更,比如增加新派生类。面向 基类在更高的抽象层次上编写 程序,程序代码就不会依赖于 特殊类型,更加稳定、健壮, 具有更好的可扩展性。
一组employee类/通用payroll()函数1 向上类型转换
2 虚函数3 抽象类 4 RTTI 5 类层次设计的例子 6 小结
class employee{ void salary(){ } }; class manager : public employee{ public: void salary(){/*经理工资的计算和发放*/} }; class programmer : public employee{ public: void salary(){/*程序员工资的计算和发放*/} }; class parttime : public employee{ public: void salary(){/*兼职人员工资的计算和发放*/} }; void payroll(employee& re) {//payroll函数 re.salary(); }
代码中类层次如下图所示1 向上类型转换
2 虚函数3 抽象类 4 RTTI 5 类层次设计的例子 6 小结
employeeCtrl payroll()
employee salary()
向上类型转换
manager salary()
programmer salary()
parttime salary()
payroll()函数具有很强的适应性
1 向上类型转换
2 虚函数3 抽象类 4 RTTI 5 类层次设计的例子 6 小结
程序中的payroll()是面向基类进行处理的 函数,这使得payroll()函数具有很强的适 应性,它能够处理任意特定类型的 employee对象,包括manager、programmer 及parttime。隐含的另一个优点是 payroll()码的可扩展性:
如果需要对类层 次进行修改,比如添加新员工类型tester (测试人员), 那么只要将 tester 作为 employee的另一个派生类即可,不用修改 payroll()函数,它对新增类型仍然适用。programmer Ron; manager Harry; parttime Lily; payroll(Harry); //OK, manager转换为 employee payroll(Ron);//OK, programmer转换为employee payroll(Lily);//OK, parttime转换为employee tester Albus; payroll(Albus);//OK, tester转换为employee
问题 1 向上类型转换
2 虚函数3 抽象类 4 RTTI 5 类层次设计的例子 6 小结
为了避免对象切片现象,这里没有 使用对象的向上类型转换。但是, 即使引用或指针的向上类型转换仍 然会损失源类型的信息。上面的各 种员工实例经过转换会丢失自身的 类型信息,编译器只知道re是 employee类型的,并不知道re实际 引用对象的真正类型。因而payroll 函数中通过re调用的总是employee 版本的salary(),而无法调用到各 个派生类中重新定义的salary()操 作。这样的替代显然不满足我们所 设想的目标。
8.2 虚函数1 向上类型转换2 虚函数 3 抽象类 4 RTTI 5 类层次设计的例子 6 小结
向上类型转换会损失类型信息, 不能真正实现替代原则。这个问 题与C++默认的函数调用绑定方 式有关。
8.2.1 函数调用绑定1 向上类型转换2 虚函数 函数调用绑定 虚函数 虚函数的相关规则 实现多态性的步骤 动态绑定的实现
3 抽象类 4 RTTI 5 类层次设计的例子 6 小结
把函数体和函数调用相联系称为绑定 (binding,也译作捆绑或编联)。C++中, 默认的函数调用绑定方式是早绑定。早绑 定又称为静态绑定,即在程序运行之前, 由编译器和连接器实现。 void payroll(employee& re) { re.salary(); } 在payroll()函数中,对salary()的调用 实施早绑定。编译器只知道re是employee 类型的引用,所以将re.salary()的调用 和employee类的salary()函数体联系在一 起。这段程序在执行时就不可能调用到其 他类的salary()函数代码。
晚绑定
1 向上类型转换2 虚函数 函数调用绑定 虚函数 虚函数的相关规则 实现多态性的步骤 动态绑定的实现
解决这个问题的方法是使用晚绑定,将绑 定推迟到程序运行时。在程序运行时,可 以获知实际接收消息的对象的类型,根据 这时的类型信息绑定函数调用。晚绑定又 称为动态绑定或运行时绑定,必须有某种 机制来确定运行时对象的类型并调用合适 的成员函数。//如果使用晚绑定,运行下面的代码之前re.salary()没有和 任何函数体联系 manager Harry; programmer Ron; //真正执行re.salary()时进行动态函数绑定 //re指向Harry, 将re.salary()动态绑定manager::salary() payroll(Harry); //re指向Ron, 将re.salary()动态
绑定programmer::salary payroll(Ron);
3 抽象类 4 RTTI 5 类层次设计的例子 6 小结
可以看到,利用动态绑定能够实现多态 性——同样的消息发送给不同对象时执行 不同的操作。在C++中,只对虚函数实施 晚绑定。
8.2.2 虚函数 1 向上类型转换2 虚函数 函数调用绑定 虚函数 虚函数的相关规则 实现多态性的步骤 动态绑定的实现
3 抽象类
4 RTTI 5 类层次设计的例子 6 小结
为了对特定成员函数进行晚绑定, C++要求在基类中将该成员函数声 明为虚函数。虚函数的声明语法是 在成员函数前加virtual关键字。 晚绑定只对虚函数起作用,并且只 有在使用含有虚函数的基类地址 (指针或引用)时发生。 虚函数在基类中用virtual关键字 声明。在所有派生类中,即使不再 重复声明,它也是虚函数。派生类 中可以重定义基类的虚函数,这称 为覆盖或改写(override)。
上面的代码可以修改为如下形式1 向上类型转换2 虚函数 函数调用绑定 虚函数 虚函数的相关规则 实现多态性的步骤 动态绑定的实现
3 抽象类 4 RTTI 5 类层次设计的例子 6 小结
class employee{ public: virtual void salary(){ } //基类中声明的虚函数 }; //下面的派生类中重写salary()都是虚函数 class manager : public employee{ public: void salary(){ /*经理工资的计算和发放*/} // };
上面的代码可以修改为如下形式1 向上类型转换2 虚函数 函数调用绑定 虚函数 虚函数的相关规则 实现多态性的步骤 动态绑定的实现
3 抽象类 4 RTTI 5 类层次设计的例子 6 小结
class programmer : public employee{ …… 此处隐藏:3209字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [实用模板]第八章:法国“新浪潮”与“左岸派”
- [实用模板]2021年北京上半年临床医学检验技师生物
- [实用模板]SAP GUI 7.10客户端安装配置文档
- [实用模板]2001年临床执业医师资格考试综合笔试试
- [实用模板]36机场工作实用英语词汇总结
- [实用模板](一)社会保险稽核通知书
- [实用模板]安全教育主题班会材料
- [实用模板]濉溪县春季呼吸道传染病防控应急演练方
- [实用模板]长沙房地产市场周报(1.30-2.3)
- [实用模板]六年级数学上册典中点 - 图文
- [实用模板]C程序设计(红皮书)习题官方参考答案
- [实用模板]中国证监会第一届创业板发行审核委员会
- [实用模板]桥梁工程复习题
- [实用模板]2011学而思数学及答案
- [实用模板]初中病句修改专项练习
- [实用模板]监理学习知识1 - 图文
- [实用模板]小机灵杯四年级试题
- [实用模板]国贸专业毕业论文模板
- [实用模板]教育学概论考试练习题-判断题4
- [实用模板]2015届高考英语一轮复习精品资料(译林
- 00Nkmhe_市场营销学工商管理_电子商务_
- 事业单位考试法律常识
- 诚信教育实施方案
- 吉大小天鹅食品安全检测箱方案(高中低
- 房地产销售培训资料
- 高一地理必修1复习提纲
- 新概念英语第二册lesson_1_练习题
- 证券公司内部培训资料
- 小学英语时间介词专项练习
- 新世纪英语专业综合教程(第二版)第1册U
- 【新课标】浙教版最新2018年八年级数学
- 工程建设管理纲要
- 外研版 必修一Module 4 A Social Surve
- Adobe认证考试 AE复习资料
- 基于H.264AVC与AVS标准的帧内预测技术
- 《食品检验机构资质认定管理办法》(质
- ABB变频器培训课件
- (完整版)小学说明文阅读练习题及答案
- 深思洛克(SenseLock) 深思IV,深思4,深
- 弟子规全文带拼音




