C++程序设计-华南理工大学 第11章_多态性和虚函数的应用与讨论(2)
发布时间:2024-11-10
发布时间:2024-11-10
C++程序设计-华南理工大学
多态性和虚函数( ) 第十一章 多态性和虚函数(2) 应用与讨论
面向对象程序设计(C++) 面向对象程序设计
《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》
C++程序设计-华南理工大学
11.8 构造抽象接口多态性的优点之一
《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》
C++程序设计-华南理工大学
11.8.1 问题描述传达员: 下午在会议 室开会!
项目规划 …
公司发 展策略
《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》
C++程序设计-华南理工大学
11.8.2 静态绑定下的实现传达员只负责通知某时某地开会,至于开什么会,怎么开, 传达员只负责通知某时某地开会,至于开什么会,怎么开, 他才不管呢。 他才不管呢。 然而实现时,程序员必须分清楚通知的对象是谁? 然而实现时,程序员必须分清楚通知的对象是谁?然后决 定应该调用那一个对象的“开会函数” 定应该调用那一个对象的“开会函数”。
switch(emp_type) { case “CTO”: ((CTO_manager *)emp)-> meeting(); break; case “Chair”: ((Chair_manager *)emp)->meeting(); break; default: ERROR(); }《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》 4
C++程序设计-华南理工大学
11.8.3 动态绑定下的实现
传达员: 下午在会 议室开会!
项目规 划
…
公司 发展 策略
《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》
C++程序设计-华南理工大学
11.8.3 动态绑定下的实现 续) 动态绑定下的实现(续CTO cto; Manager * pman ; pman = &cto; // 把所有的派生类对象当成基类处理 pman -> meeting() ; // 通过抽象接口实现
《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》
C++程序设计-华南理工大学
11.9 提高模块的独立性多态性的优点之二: 多态性的优点之二:可扩展性好
《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》
C++程序设计-华南理工大学
11.9.1 静态绑定下的扩充讨论: 当需求发生变化时, 如何修改代码? 讨论: 当需求发生变化时, 如何修改代码? 设置line的type时必须问一下:“嘿, 我可以设成L么? 设置line type时必须问一下 line的 时必须问一下: 我可以设成L 修改enum shape_type = {P,C,Y,L}; 修改enum {P,C,Y,L 定义Line类; 定义Line Line类 修改函数 draw_all(),由于switch逻辑的存在,因此代 draw_all(),由于switch逻辑的存在 由于switch逻辑的存在, 码的修改量是呈组合数量级增长的。 组合数量级增长的 码的修改量是呈组合数量级增长的。 因此,可扩展性很不好! 因此,可扩展性很不好!
《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》
C++程序设计-华南理工大学
11.9.2 动态绑定下的扩
充现在要增加类Line,只需要: 现在要增加类Line,只需要: Line,只需要 从基类Shape中派生出Line Shape中派生出Line类 ① 从基类Shape中派生出Line类; 无需设置类型域, ② 无需设置类型域,无需改变其它任何的代码!
《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》
C++程序设计-华南理工大学
增加line类 类 增加 class Line : public Shape { public: Line( Point s,Point e ):start(s),end(e); void setLine( int, int, int , int ); int getX1() const { return x1; } int getY1() const { return y1; } int getX2() const { return x2; } int getY2() const { return y2; } virtual void printShapeName() const { cout << “Line: "; } virtual void draw(); protected: Point start, end; };《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》 10
C++程序设计-华南理工大学
修改main()函数 (没有任何变化 函数 没有任何变化 没有任何变化) 修改 int main() { Point point1( 7, 11 ); // create a Point Circle circle1( 3.5, 22, 8 ); // create a Circle Cylinder cylinder1( 10, 3.3, 10, 10 ); // create a Cylinder Circle circle2(2.5,10,15); //create a Circle Shape *arrayOfShapes[ 5 ]; // array of base-class pointers arrayOfShapes[ 0 ] = &point1; arrayOfShapes[ 1 ] = &circle1; arrayOfShapes[ 2 ] = &cylinder1; arrayOfShapes[ 3 ] = &cycle2; for(int i=0; i<4; i++){ arrayofShapes[i]->draw(); // 动态关联 } }《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》 11
C++程序设计-华南理工大学
也就是说, 也就是说,假如只是增加类 Line,而没有创建 , 该类的对象,程序不需要做任何其它修改!! 该类的对象,程序不需要做任何其它修改!!
《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》
C++程序设计-华南理工大学
增加Line对象后的 对象后的main()函数 有细微的变化 函数(有细微的变化 增加 对象后的 函数 有细微的变化)int main() { Point point1( 7, 11 ); // create a Point Circle circle1( 3.5, 22, 8 ); // create a Circle Cylinder cylinder1( 10, 3.3, 10, 10 ); // create a Cylinder Circle circle2(2.5,10,15); //create a Circle Line line(7,10,20,25); Shape *arrayOfShapes[ 5 ]; // array of base-class pointers arrayOfShapes[ 0 ] = &point1; arrayOfShapes[ 1 ] = &circle1; arrayOfShapes[ 2 ] = &cylinder1; arrayOfShapes[ 3 ] = &cycle2; arrayOfShaoes[ 4 ] = &line; for(int i=0; i<5; i++){ arrayofShapes[i]->draw(); // 动态关联 } }《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》 13
C++程序设计-华南理工大学
即使需要创建类Line的对象, 即使需要创建类Line的对象,这种更改也是很容 Line的对象 易实现的! 易实现的!
《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》
C++程序设计-华南理工大学
分钟内完成) 习题 (30分钟内完成) 分钟内完成信息学院教学办随机抽取100名学院的
学生到中国科学院实习,他们来自不同的系: 信息学院教学办随机抽取100名学院的学生到中国科学院实习,他们来自不同的系: 100名学院的学生到中国科学院实习 CS、Auto、 EE;但教学办并不知道他们应该到那个所实习 事实上, 但教学办并不知道他们应该到那个所实习。 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的自我介绍 允许两个学生对象之间的赋值操作。 仅表示用stu2 stu2的自我介绍 内容设置stu1的自我介绍; stu1的自我介绍 内容设置stu1的自我介绍; 4. 成员函数setmessage(char * )设置自我介绍内容; getmessage()获取自我介 成员函数setmessage(char )设置自我介绍内容 设置自我介绍内容; getmessage()获取自我介 绍内容;pratice()表示实习过程 表示实习过程。 绍内容;pratice()表示实习过程。
《面向对象程序设计》 中国科学技术大学计算机系 马建辉 面向对象程序设计》
C++程序设计-华南理工大学
11.10 防止组合爆炸当存在多个类型相互组合的情况时, 当存在多个类型相互组合的情况时,静态绑定 下的switch逻辑将会出现“组合爆炸” switch逻辑将会出现 下的switch逻辑将会出现“组合爆炸”。 而动态绑定下的代码扩充量则是“线性的” 而动态绑定下的代码扩充量则是“线性的”。
《面向对象程序设计》 中国科学
技术大学计算机系 马建辉 面向对象程序设计》
上一篇:福尼斯焊机故障代码表
下一篇:项目计划进度控制与资源管理