文档详情

C++程序设计华南理工大学第11章多态性和虚函数的应用与讨论2.ppt

发布:2017-05-21约9.48千字共40页下载文档
文本预览下载声明
第十一章 多态性和虚函数(2) 应用与讨论 面向对象程序设计(C++) 11.8 构造抽象接口 11.8.1 问题描述 11.8.2 静态绑定下的实现 传达员只负责通知某时某地开会,至于开什么会,怎么开,他才不管呢。 然而实现时,程序员必须分清楚通知的对象是谁?然后决定应该调用那一个对象的“开会函数”。 11.8.3 动态绑定下的实现 11.8.3 动态绑定下的实现(续) 11.9 提高模块的独立性 多态性的优点之二:可扩展性好 11.9.1 静态绑定下的扩充 11.9.2 动态绑定下的扩充 现在要增加类Line,只需要: 从基类Shape中派生出Line类; 无需设置类型域,无需改变其它任何的代码! 习题 (30分钟内完成) 信息学院教学办随机抽取100名学院的学生到中国科学院实习,他们来自不同的系:CS、Auto、和EE;但教学办并不知道他们应该到那个所实习。事实上,计算机系的学生知道自己应该到软件所实习,自动化系到自动化所,电子工程系到电子所。假设每个学生在实习时首先要进行自我介绍。请编程模拟上述过程。 具体要求为: 1. 设计学生类,信息包含姓名(8字节字符)、学号(8字节字符)、自我介绍(动态申请内存空间);学生的学号在对象生成时由程序统一设定,要求学号不重复; 2. 可以以下列方式产生学生对象: Cstudent stu1(“Mike”); // 仅设定姓名; Cstudent stu2(“Rick”, “I am rick , from USTC” ); // 仅设定姓名和自我介绍。 Cstudent stu3(stu2); // 从一个对象初始化另一个对象,表示的是两个学生同 // 名,自我介绍内容也相同。 3. 允许两个学生对象之间的赋值操作。如:stu1=stu2; 仅表示用stu2的自我介绍 内容设置stu1的自我介绍; 4. 成员函数setmessage(char * )设置自我介绍内容; getmessage()获取自我介 绍内容;pratice()表示实习过程。 11.10 防止组合爆炸 11.10.1 引言:表达式求值 类的层次图 11.10.2 讨论:静态绑定的表达式求值 求某个结点的值时,由于向上类型转换,结点的类型都变成Node *,因此,必须依赖switch逻辑判断左子树和右子树结点的类型,才能正确地绑定到左右子结点的求值函数,最后得到根结点的值。 11.10.3 动态绑定的表达式求值 1. 设计结点的类层次 2. 实现各个结点类及主函数 派生类定义: 派生类定义(续): 3. 扩充:支持 – (减运算)、/ (除运算) 11.10.4 讨论:交互式表达式计算 需要编译器的lex和yacc支持:根据用户输入的表达式动态产生表达式树。 具体实现(略):参见《编译原理》词法分析和语法分析相关章节。 11.10.5 讨论:如何支持混合运算 假设结点中可能有复数,并且允许复数和整数的混合运算,该如何处理? 例如:np1+np2有四种可能: 1):复数 + 复数 2):整数 + 复数 3):复数 + 整数 4):整数 + 整数 11.11 虚运算符重载函数注 多重指派技术:虚函数与运算符重载函数的完美结合! 11.11.1 问题:混合运算 思路一:虚函数 分析:虚函数的本质是能够动态确定一个对象的类型,而由于 m1*m2?m1.operator*(m2)中存在两个未确定的类型。因此,试图依赖一次虚函数调用无法同时动态确定m1和m2的类型; 思路二:重载“+” 分析:由于重载函数是必须依赖参数来决定确定具体调用的版本。而 m1*m2(? m1.operator*(m2))中,m1可以通过虚函数动态绑定,但m2的类型尚未确定。因此单纯依赖重载函数不能解决。 思路三:两者结合(多重指派技术) (不妨设为 Matrix * Vector) 11.11.2 多重指派:程序的实现(demo) 小结 作业: class Node{ // 基类,结点类 public: Node(){}; virtual ~Node(){ }; vi
显示全部
相似文档