- 12
- 0
- 约3.95千字
- 约 18页
- 2019-03-08 发布于天津
- 举报
C++程序设计教程 第12讲: 虚函数(II) 多态性 多态性(polymorphism) 多态性的特性 利用虚函数和多态性,程序员可以处理普遍性而让执行环境处理特殊性。 多态性提高了可扩展性:处理多态性行为的软件可用与接收消息的对象无关的方式编写。(利用动态联编的特性)如:插件技术 抽象类为类层次结构中的各个成员定义接口。 纯虚函数没有实体; 纯虚函数必须在派生类中实现。 尽管不能实例化抽象基类的对象,但却可以声明抽象基类的指针。例: 如果 Shape 是抽象基类, 不能:Shape Ob; 但可以: Shape* pOb; 多态性特别适合于实现分层的软件系统。 实例研究:工资单系统 输出代码 Employee* ptr; // 基类指针 Boss b ( “John”,”Smith”,800.00); ptr = b; // 指向派生类对象的基类指针 ptr-print(); // 动态绑定 cout “earned $” ptr-earnings(); // 动态绑定 b.print(); // 静态绑定 cout “earned $” b.earnings(); // 静态绑定 实例研究 新类和动态绑定 动态绑定:允许向系统中添加新类。编译时可以不必知道对象的类型。在运行时,虚函数调用和被调用对象的成员函数匹配。 屏幕管理程序可以不经过重新编译就可以处理新的显示对象。 C++是如何实现动态绑定的 在运行时,每一个包含虚函数的类都有一个虚函数表 vtable: 利用这个vtable实现动态联编,从而实现多态性。 从运行效率来说,多态性和switch语句编的程序具有同样的效率。 多态性在链表设计中的应用 多态性(polymorphism) 通过继承而相关的不同的类,他们的对象能够对同一个函数调用作出不同的响应。 数组和链表 数组(Array)是固定大小的。 如: int array[10]; 链表(List)的大小不固定,它是由一个个结点组成。每个结点由数据和指向下一个结点的指针组成,如: struct listnode { int data; listnode *next; } 类型域和switch语句 class Circle { int DrawCircle(); } class Square { int DrawSquare(); } class Triangle { int DrawTriangle(); } Circle c; Square s; Triangle t; switch ( paint ) { case 0: c.DrawCircle(); break; case 1: s.DrawSquare(); break; case 2: t.DrawTriangle(); break; } 用链表记录这些操作 我们希望将这些画图的动作记录下来。 由于各类的数据结构不同,所以只能记录各类对象的指针。 将这些指针记录到一个数组(Array)或链表(List)中。(下面着重讲链表,数组也一样) 注意:记录到链表中只能是同一个类的指针! 所以上面这些操作无法记录到一个链表中,于是我们利用派生类指针可转换成其基类指针的功能,这样设计这些类。 设计作图类 class Shape { int Draw(); } // base class class Circle : public Shape // derived class { int Draw(); } class Square : public Shape // derived class { int Draw(); } class Triangle : public Shape // derived class { int Draw(); } 设链表为 List,里面记录着 Shape 的指针。 class List { public: void operator += (Shape*); Shape* operator [] (int index); }; 多态性要达到的目标 Circle c; List += (Shape*)c; Square s; List += (Shape*)s; Triangle t; List += (Shape*)t; 我们设想,要恢复记录时,只需: for ( int i=0; i n; i++ ) List[i]-Draw(); 虚函数 虚函数的目的是告诉编译器,对于指向基类的指针而言,如果它派生类中有同名的函数(被重载),则优先执行派生类中的该函数。 用虚函
您可能关注的文档
- 2019年A类班级能力提高阶段——学习策略教改报告.doc
- 2019年B.重点专项目标考核办法.doc
- 2019年B1包、财务软件.doc
- 2019年B2C电子商务中的信用风险分析及对策.doc
- 2019年B4包、医疗信息系统升级改造.doc
- 2019年B5包、山东省物联网产品质检中心实验室信息管理系统.doc
- 2019年BD-EIP综合管理平台功能清单.doc
- 2019年BEASCarShow——品车·品酒·品音乐1912时尚夜车展策.ppt
- 2019年BeautyIsMoney-生技产业在美容市场的商机-.ppt
- 2019年BeihangSoftwareCollege程建群博士(Dr.JasonCheng).ppt
原创力文档

文档评论(0)