教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 实用模板 >

第8章 虚函数与多态性

来源:网络收集 时间:2026-01-14
导读: 第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++中通过向上类型转换实现,

第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字,全部文档内容请下载后查看。喜欢就下载吧 ……

第8章 虚函数与多态性.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/1335170.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)