《虚函数与多态性》PPT课件

《虚函数与多态性》PPT课件

ID:45567576

大小:1.19 MB

页数:78页

时间:2019-11-14

《虚函数与多态性》PPT课件_第1页
《虚函数与多态性》PPT课件_第2页
《虚函数与多态性》PPT课件_第3页
《虚函数与多态性》PPT课件_第4页
《虚函数与多态性》PPT课件_第5页
资源描述:

《《虚函数与多态性》PPT课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第8章虚函数与多态性主要内容1234568.1向上类型转换8.2虚函数8.3抽象类8.4RTTI8.5类层次设计的例子8.6小结8.1向上类型转换替代原则在C++中通过向上类型转换实现,可以将一个公有派生类的对象或地址作为基类对象或地址来处理。派生类向上转换为基类类型,这在逻辑上是合理的,在物理上也是安全的。在逻辑上方面,派生类继承基类的公共接口,能够发送给基类对象的消息也能够发送给派生类对象。派生类是特殊的基类类型,派生类对象(或地址)可以作为基类的实例(或地址),替代基类对象(或地址)使用。在物理方面,基类的

2、成员被派生类继承,在派生类对象中封装着一个无名的基类子对象,派生类对象的存储空间中从首地址开始存放的的这个基类子对象。因此,进行向上类型转换时,通过派生类对象切片,能够提供足够的基类信息,得到基类对象。而使用基类指针(或引用)指向派生类对象时也不会破坏指针(或引用)的指向规则。2虚函数3抽象类4RTTI5类层次设计的例子向上类型转换16小结面向基类编写程序使用继承和替代原则对于改善代码的结构意义非凡。相对于各种特殊的派生类而言,基类更加抽象,更具一般性。相对于继承层次中比较稳定的上层类,低层派生类更容易发生变更,

3、比如增加新派生类。面向基类在更高的抽象层次上编写程序,程序代码就不会依赖于特殊类型,更加稳定、健壮,具有更好的可扩展性。2虚函数3抽象类4RTTI5类层次设计的例子向上类型转换16小结一组employee类/通用payroll()函数classemployee{voidsalary(){}};classmanager:publicemployee{public:voidsalary(){/*经理工资的计算和发放*/}};classprogrammer:publicemployee{public:voidsalar

4、y(){/*程序员工资的计算和发放*/}};classparttime:publicemployee{public:voidsalary(){/*兼职人员工资的计算和发放*/}};voidpayroll(employee&re){//payroll函数re.salary();}2虚函数3抽象类4RTTI5类层次设计的例子向上类型转换16小结代码中类层次如下图所示2虚函数3抽象类4RTTI5类层次设计的例子向上类型转换16小结payroll()函数具有很强的适应性程序中的payroll()是面向基类进行处理的函数,

5、这使得payroll()函数具有很强的适应性,它能够处理任意特定类型的employee对象,包括manager、programmer及parttime。隐含的另一个优点是payroll()码的可扩展性:如果需要对类层次进行修改,比如添加新员工类型tester(测试人员),那么只要将tester作为employee的另一个派生类即可,不用修改payroll()函数,它对新增类型仍然适用。programmerRon;managerHarry;parttimeLily;payroll(Harry);//OK,manag

6、er转换为employeepayroll(Ron);//OK,programmer转换为employeepayroll(Lily);//OK,parttime转换为employeetesterAlbus;payroll(Albus);//OK,tester转换为employee2虚函数3抽象类4RTTI5类层次设计的例子向上类型转换16小结问题为了避免对象切片现象,这里没有使用对象的向上类型转换。但是,即使引用或指针的向上类型转换仍然会损失源类型的信息。上面的各种员工实例经过转换会丢失自身的类型信息,编译器只知道

7、re是employee类型的,并不知道re实际引用对象的真正类型。因而payroll函数中通过re调用的总是employee版本的salary(),而无法调用到各个派生类中重新定义的salary()操作。这样的替代显然不满足我们所设想的目标。2虚函数3抽象类4RTTI5类层次设计的例子向上类型转换16小结8.2虚函数向上类型转换会损失类型信息,不能真正实现替代原则。这个问题与C++默认的函数调用绑定方式有关。3抽象类4RTTI5类层次设计的例子1向上类型转换虚函数26小结8.2.1函数调用绑定把函数体和函数调用相

8、联系称为绑定(binding,也译作捆绑或编联)。C++中,默认的函数调用绑定方式是早绑定。早绑定又称为静态绑定,即在程序运行之前,由编译器和连接器实现。voidpayroll(employee&re){re.salary();}在payroll()函数中,对salary()的调用实施早绑定。编译器只知道re是employee类型的引用,所以将re.salary()的调用

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。