版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第1515章章 多态性多态性讲授内容讲授内容n静态绑定和动态绑定的概念静态绑定和动态绑定的概念n多态性的意义和作用多态性的意义和作用n虚函数的定义方法虚函数的定义方法n抽象基类的作用和定义方法抽象基类的作用和定义方法n虚析构函数的作用和使用方法虚析构函数的作用和使用方法n如何在程序中实现多态性如何在程序中实现多态性15.1 15.1 多态性的概念多态性的概念(1/5)(1/5)n多态性:具有继承关系的类,其对象对多态性:具有继承关系的类,其对象对同一个函数调用可以作出不同的响应同一个函数调用可以作出不同的响应n同一个函数调用同一个函数调用同一条函数调用语句同一条函数调用语句n不同的响应不同的
2、响应执行不同的函数执行不同的函数15.1 15.1 多态性的概念多态性的概念(2/5)(2/5)n静态绑定和动态绑定静态绑定和动态绑定n静态绑定静态绑定编译时就能确定一条函数调用编译时就能确定一条函数调用语句要调用的函数语句要调用的函数n和面向对象的思想不太相符和面向对象的思想不太相符n一条指令对应不同对象的不同操作一条指令对应不同对象的不同操作现实需要现实需要15.1 15.1 多态性的概念多态性的概念(3/5)(3/5)n静态绑定和动态绑定静态绑定和动态绑定n动态绑定:运行时才能确定函数调用语句调动态绑定:运行时才能确定函数调用语句调用的函数用的函数n调用对象的成员函数时(通过引用或指针)
3、,编调用对象的成员函数时(通过引用或指针),编译器暂不确定要调用的函数译器暂不确定要调用的函数n编译器检查被调用函数是否存在(函数名、参数编译器检查被调用函数是否存在(函数名、参数列表、返回值)列表、返回值)n程序运行时,系统根据接收消息的对象类型来确程序运行时,系统根据接收消息的对象类型来确定要调用的函数定要调用的函数15.1 15.1 多态性的概念多态性的概念(4/5)(4/5)n多态性的实现多态性的实现n通过基类指针或引用调用虚函数通过基类指针或引用调用虚函数n动态绑定动态绑定n多态性有助于更好地对程序进行抽象多态性有助于更好地对程序进行抽象n控制模块能专注于一般性问题的处理控制模块能专
4、注于一般性问题的处理n具体的操作交给具体的对象去做具体的操作交给具体的对象去做 15.1 15.1 多态性的概念多态性的概念(5/5)(5/5)n多态性有助于提高程序的可扩展性多态性有助于提高程序的可扩展性n可以把控制模块与被操作的对象分开可以把控制模块与被操作的对象分开n可以添加已定义类的新对象,并能管理该对象可以添加已定义类的新对象,并能管理该对象n可以添加新类(已有类的派生类)的新对象,并能可以添加新类(已有类的派生类)的新对象,并能管理该对象管理该对象n常用的程序设计方法常用的程序设计方法n为具有继承关系的类定义接口(虚函数)为具有继承关系的类定义接口(虚函数)n用链表或数组组织所有对
5、象用链表或数组组织所有对象n用基类指针操作这些对象用基类指针操作这些对象15.2 15.2 虚函数虚函数n虚函数的定义虚函数的定义n在函数原型前加上关键字在函数原型前加上关键字virtualn如果一个函数在基类中被声明为虚函数,则如果一个函数在基类中被声明为虚函数,则他在所有派生类中都是虚函数(包括重定义他在所有派生类中都是虚函数(包括重定义函数)函数) virtual void show();n只有通过基类指针或引用调用虚函数才只有通过基类指针或引用调用虚函数才能引发动态绑定能引发动态绑定例子例子1 1:虚函数与多态性例子:虚函数与多态性例子(1/3)(1/3)/文件文件base.h/定义基
6、类定义基类#if !defined _BASE_H_#define _BASE_H_#include class Base public: virtual void show() coutI am Bases object!n; ; #endif例子例子1 1:虚函数与多态性例子:虚函数与多态性例子(2/3)(2/3)/文件文件derived.h/定义基类定义基类Derived#if !defined _DERIVED_H_#define _DERIVED_H_#include base.h class Derived :public Basepublic: void show() couts
7、how();/用基类指针调用成员函数,动态绑定用基类指针调用成员函数,动态绑定 bPtr= &dObj;/基类指针指向基类对象基类指针指向基类对象 bPtr-show();/用基类指针调用成员函数,动态绑定用基类指针调用成员函数,动态绑定 return 0; 程序运行如果程序运行如果I am Bases object!I am Deriveds object!15.3 15.3 抽象基类和纯虚函数抽象基类和纯虚函数(1/4)(1/4)n实现多态性的前提实现多态性的前提n需要有共同的基类需要有共同的基类n需要在基类中定义共同的接口需要在基类中定义共同的接口n接口要定义为虚函数接口要定义为
8、虚函数n如果基类的接口没办法实现怎么办?如果基类的接口没办法实现怎么办?n如形状类如形状类ShapeShape15.3 15.3 抽象基类和纯虚函数抽象基类和纯虚函数(2/4)(2/4)n解决方法解决方法n不实现这些接口:纯虚函数不实现这些接口:纯虚函数n包含纯虚函数的类:抽象基类包含纯虚函数的类:抽象基类n抽象基类不能实例化对象抽象基类不能实例化对象n形状类形状类ShapeShape的对象是什么?的对象是什么?15.3 15.3 抽象基类和纯虚函数抽象基类和纯虚函数(3/4)(3/4)n纯虚函数纯虚函数n没有函数体的没有函数体的“初始化为初始化为0”的函数的函数 /纯虚函数纯虚函数 virt
9、ual double area() const = 0; n纯虚函数不需要实现纯虚函数不需要实现15.3 15.3 抽象基类和纯虚函数抽象基类和纯虚函数(4/4)(4/4)n抽象类和具体类抽象类和具体类n包含纯虚函数的类不能实例化对象,是抽象包含纯虚函数的类不能实例化对象,是抽象类类n如果抽象类的派生类实现了所有基类中的纯如果抽象类的派生类实现了所有基类中的纯虚函数,则不再是抽象类虚函数,则不再是抽象类n抽象类存在的意义是作为其它类的基类,抽象类存在的意义是作为其它类的基类,也叫抽象基类也叫抽象基类例子例子2 2:抽象基类的例子:抽象基类的例子(1/6)(1/6)/文件文件shape.h/定义
10、抽象基类定义抽象基类Shape#if !defined _SHAPE_H_#define _SHAPE_H_#include class Shape public: virtual double area() const = 0; virtual void show() const = 0; #endif例子例子2 2:抽象基类的例子:抽象基类的例子(2/6)(2/6)/文件文件circle.h,定义派生类定义派生类Circle#if !defined _CIRCLE_H_#define _CIRCLE_H_#include shape.h#define PI 3.1416class Circ
11、le :public Shape public: Circle(double = 0.0, double = 0.0, double = 1.0);Circle(double = 0.0, double = 0.0, double = 1.0); double area() const; void show() const;private: double x,y; double r;#endif例子例子2 2:抽象基类的例子:抽象基类的例子(3/6)(3/6)/文件文件circle.cpp,实现类实现类Circle#include circle.hCircle:Circle(double a,
12、 double b, double c) x = a; y = b; r = c;double Circle:area() const return PI*r*r; void Circle:show() const coutI am a Circle: ;例子例子2 2:抽象基类的例子:抽象基类的例子(4/6)(4/6)/文件文件rectangle.h/定义派生类定义派生类Rectangle#if !defined _RECTANGLE_H_#define _RECTANGLE_H_#include shape.hclass Rectangle :public Shape public: Re
13、ctangle(double = 1.0, double = 1.0); double area() const; void show() const;private: double length; double width;#endif例子例子2 2:抽象基类的例子:抽象基类的例子(5/6)(5/6)/文件文件rectangle.cpp,实现类实现类Rectangle#include rectangle.hRectangle:Rectangle(double a, double b) length = a; width = b;double Rectangle:area() const re
14、turn length*width;void Rectangle:show() const cout I am a Rectangle: ;例子例子2 2:抽象基类的例子:抽象基类的例子(6/6)(6/6)/文件文件ex15_3.cpp,测试类测试类Shape的层次结构的层次结构#include circle.h#include rectangle.hvoid callArea(Shape &);main() Circle cir(0.0, 0.0, 2.5); Rectangle rec(2.4, 5.3); callArea(cir); callArea(rec); return
15、0;void callArea(Shape &obj) obj.show(); coutarea = obj.area()endl; 程序运行结果程序运行结果I am a Circle: area = 19.635I am a Rectangle: area = 12.7215.4 15.4 虚析构函数虚析构函数n构造函数的执行顺序:从上到下构造函数的执行顺序:从上到下n析构函数的执行顺序:从下到上析构函数的执行顺序:从下到上n创建对象时要执行正确的构造函数创建对象时要执行正确的构造函数n撤销对象时要执行正确的析构函数撤销对象时要执行正确的析构函数n问题:动态对象的创建和撤销问题:动态
16、对象的创建和撤销15.4 15.4 虚析构函数虚析构函数n动态对象的创建动态对象的创建n动态创建的对象没有问题动态创建的对象没有问题 new ClassName();new ClassName();nClassNameClassName指明了要调用的构造函数指明了要调用的构造函数n动态对象的撤销动态对象的撤销 delete delete 基类指针基类指针; ;n如果基类指针指向的是派生类的对象呢?如果基类指针指向的是派生类的对象呢?15.4 15.4 虚析构函数虚析构函数n析构函数可以声明为虚函数析构函数可以声明为虚函数 delete delete 基类指针基类指针; ;n程序会根据基类指针指
17、向的对象的类型确定程序会根据基类指针指向的对象的类型确定要调用的析构函数要调用的析构函数n基类的析构函数为虚函数,所有派生类的析基类的析构函数为虚函数,所有派生类的析构函数都是虚函数构函数都是虚函数n如果要操作具有继承关系的类的动态对如果要操作具有继承关系的类的动态对象,最好使用虚析构函数象,最好使用虚析构函数例子例子3 3:虚析构函数的例子:虚析构函数的例子/文件文件employee.h,定义基类定义基类Employee#include #if !defined _EMPLOYEE_H_#define _EMPLOYEE_H_class Employeepublic: Employee()
18、coutEmployee begin!endl; virtual Employee() coutEmployee end!endl; ;#endif例子例子3 3:虚析构函数的例子:虚析构函数的例子/文件文件programmer.h,定义派生类定义派生类Programmer#include #include #include employee.hclass Programmer: public Employeepublic: Programmer(char *str) coutProgrammer begin!endl; name = new charstrlen(str)+1; strcpy
19、(name, str); Programmer() delete name; coutProgrammer end!endl; private: char *name;例子例子3 3:虚析构函数的例子:虚析构函数的例子/文件文件accountant.h,定义派生类定义派生类Accountant#include #include employee.hclass Accountant: public Employeepublic: Accountant(int n) coutAccountant begin!endl; age = n; Accountant() coutAccountant en
20、d!endl; private: int age;例子例子3 3:虚析构函数的例子:虚析构函数的例子/文件文件ex15_4.cpp#include accountant.h#include programmer.hconst int MAX = 100;main() int no; /声明储存雇员信息的数组声明储存雇员信息的数组 Employee *ptrMAX, *tptr; int ENum = 0; char name100; int age; for (int i=0; iMAX; i+) ptri = NULL; 例子例子3 3:虚析构函数的例子:虚析构函数的例子 /输入雇员信息输入雇员信息 coutInput employees info:endl; cout1 - Programmerendl 2 - Accountantendl 0 - exitno; while (no) switch (no) case 1:/输入程序员信息输入程序员信息coutname;/创建程序员对象创建程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深度解析(2026)《FZT 32011-2009大麻纱》
- 《JBT 8472.1-1996蒸气流真空泵性能测定 第一部分 抽气速率(体积流率)的测定》专题研究报告
- 2026年昆明市五华区社区工作者招聘笔试模拟试题及答案解析
- 全国粤教版信息技术七年级下册第二章第二节《制作胆小鬼机器人》教学设计设计
- 2026年乌鲁木齐市沙依巴克区社区工作者招聘考试参考试题及答案解析
- 2026年济南市槐荫区社区工作者招聘考试备考试题及答案解析
- 人教版 (新课标)必修一7 记念刘和珍君教案设计
- 2026年双鸭山市尖山区社区工作者招聘考试参考试题及答案解析
- 2026年山东省社区工作者招聘笔试参考试题及答案解析
- 2026年吉林省辽源市社区工作者招聘考试备考试题及答案解析
- 重庆南开中学高2026届高三下学期3月第七次质量检测英语(月考七)+答案
- 2026年全民国家安全教育日专题课件:筑牢国家安全防线 共护人民幸福家园
- 2026德州银行校园招聘38人笔试参考题库及答案解析
- GB/T 31458-2026医院安全防范要求
- 雨课堂学堂在线学堂云《柴油机构造与使用(火箭军工程)》单元测试考核答案
- 游客中心培训
- 江西省南昌市2025-2026学年上学期期末八年级数学试卷(含答案)
- 自建房修建免责协议书
- BMS培训课件教学课件
- 2026年东莞市厚街控股集团有限公司招聘14名工作人员备考题库完整参考答案详解
- 休克课稿教案
评论
0/150
提交评论