《面向对象第五章优秀课件.ppt》由会员分享,可在线阅读,更多相关《面向对象第五章优秀课件.ppt(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象第五章第1页,本讲稿共27页n本章的学习内容本章的学习内容多多态性的概念性的概念静静态联编和和动态联编的概念的概念虚函数的概念虚函数的概念抽象抽象类的概念的概念 第2页,本讲稿共27页 5.1 多态性的概念多态性的概念 n多多态性性是指在是指在类层次次结构的相同构的相同类或不同或不同类中中,可用可用相同的函数名相同的函数名实现功能不同的操作,从而可以使用功能不同的操作,从而可以使用相同的相同的调用方式来用方式来调用用这些具有不同功能的同名函些具有不同功能的同名函数,数,实现不同情况下的不同操作。不同情况下的不同操作。如下如下图所示所示。第3页,本讲稿共27页nC+C+的多态性可使同一条
2、的多态性可使同一条消息,被不同类型的对象消息,被不同类型的对象接收时将产生不同的行为。接收时将产生不同的行为。n多态性是实现多态性是实现“一种接口,一种接口,多种方法多种方法”的技术。的技术。这里这里的的“一种接口一种接口”是指相同是指相同函数名和参数表,而函数名和参数表,而“多多种方法种方法”是指多种函数实是指多种函数实现,实现相似但不完全相现,实现相似但不完全相同的功能。同的功能。第4页,本讲稿共27页nC+C+支持的多支持的多态可以分可以分为两种两种类型:型:编译时多多态:在同一个:在同一个类或不同或不同类中可用相同的中可用相同的函数名和不同的参数表来函数名和不同的参数表来实现不同的功能
3、操作,不同的功能操作,编译系系统在在编译阶段就可以根据段就可以根据调用函数的参数用函数的参数表来确定表来确定调用哪个同名函数。用哪个同名函数。class pointer int x,y;public:pointer(int cx,int cy)x=cx;y=cy;pointer(const pointer&p)x=p.x;y=p.y;void main()pointer ob1(40,50);pointer ob2=ob1;第5页,本讲稿共27页运行运行时多多态:在在类的的继承承层次次结构中,不同构中,不同层次的次的类中可能具有同名但中可能具有同名但实现不同的函数,需要在运行不同的函数,需要在
4、运行阶段才能根据段才能根据对象所属的象所属的层次来确定次来确定调用哪个用哪个类中的中的同名函数。同名函数。第6页,本讲稿共27页5.2 联编联编n多多态性的性的实现过程中,把一个消息函数(程中,把一个消息函数(如如student1.display()student1.display()与一个与一个对象的具体函数象的具体函数体相体相联系的系的过程叫做程叫做联编(bindingbinding)。n按照按照联编时所所处阶段的不同,可以把段的不同,可以把联编分分为静静态联编和和动态联编,这两种两种联编过程分程分别对应着多着多态性的两种性的两种实现方式。方式。5.2.1 静态联编静态联编 在在编译阶段由
5、段由编译系系统根据根据调用函数的操作参数用函数的操作参数来确定来确定调用哪个同名函数用哪个同名函数,并将函数并将函数调用与用与该函函数体数体连接起来接起来.第7页,本讲稿共27页例例5-1 静态联编静态联编#include class Student public:void print()cout“A student”endl;void print(int a)coutaendl;class GStudent:public Student public:void print()cout“A graduate student”print();ps=&s2;ps-print();A student
6、 A graduate student A student A student A student第9页,本讲稿共27页5.2.2 动态联编动态联编n只有在运行程序时才能只有在运行程序时才能根据函数根据函数调用指令来用指令来确定将要调确定将要调用的函数,这种在运行阶段进行的联编称为用的函数,这种在运行阶段进行的联编称为动态联动态联编编。例如,下例中用指针调用同名函数例如,下例中用指针调用同名函数。第10页,本讲稿共27页n动态联编的优点动态联编的优点是提供了更好的编程灵活性、是提供了更好的编程灵活性、问题的抽象性和程序的易维护性,缺点是与问题的抽象性和程序的易维护性,缺点是与静态联编相比,函数
7、调用速度慢。(静态联编相比,函数调用速度慢。(如如 p-print();)n问题的抽象性:在实际应用中,编程人员不必问题的抽象性:在实际应用中,编程人员不必过多地考虑类的层次关系,无须显式地写出虚过多地考虑类的层次关系,无须显式地写出虚函数的路径,只需将对象指针指向相应的派生函数的路径,只需将对象指针指向相应的派生类对象或引用相应的对象,通过动态联编就可类对象或引用相应的对象,通过动态联编就可以对消息做出正确的反应。以对消息做出正确的反应。(如如 p-print();)第11页,本讲稿共27页5.3 虚函数 虚函数是虚函数是动态联编的基的基础。基。基类的虚函数的虚函数经过派派生之后,在生之后,
8、在类族中可以族中可以实现运行运行时的多的多态性。性。5.3.1 虚函数的声明 虚函数是一个在某基类中用virtual声明的,并在一个或多个派生类中被重新定义的成员函数。声明虚函数的格式如下:virtual ();一个函数一旦声明为虚函数,则在每层派生类中,该函数都保持虚函数特性。因此,在派生类中重新定义该函数时,可以省略关键字virtual。但为了程序的可读性,往往不省略。第12页,本讲稿共27页5.3.2 虚函数的使用虚函数的使用n如果某类中的一个成员函数被说明为虚函数,这就如果某类中的一个成员函数被说明为虚函数,这就意味着该成员函数在派生类中可能有不同的函数实意味着该成员函数在派生类中可能
9、有不同的函数实现。现。n当使用对象指针或对象引用调用虚函数时,就当使用对象指针或对象引用调用虚函数时,就可实现动态联编,即在运行时进行关联或绑定。可实现动态联编,即在运行时进行关联或绑定。n定定义一个基一个基类的的对象指象指针就可以指向不同派生就可以指向不同派生类的的对象象,来来调用不同派生用不同派生类的的虚函数虚函数;(2);(2)只有通只有通过对象指象指针或或对象引用来象引用来调用用虚函数虚函数,才能才能实现动态联编。如果采用如果采用对象来象来调用虚函数用虚函数,则采用的仍然采用的仍然是静是静态联编方式。方式。第13页,本讲稿共27页例例5-2 静态联编和动态联编静态联编和动态联编#inc
10、lude class Student public:virtual void print()cout“A student”endl;class GStudent:public Student public:virtual void print()cout“A graduate student”print();ps=&s2;ps-print();A student A graduate studentA studentA studentA graduate student第15页,本讲稿共27页使用虚函数时应注意:使用虚函数时应注意:(1 1)在派生类中重新定义虚函数时,必须保证函数的在派生类中
11、重新定义虚函数时,必须保证函数的返回值类型和参数与基类中的声明完全一致。返回值类型和参数与基类中的声明完全一致。在类的在类的成员函数被声明为虚函数后,派生类就具有多态性。成员函数被声明为虚函数后,派生类就具有多态性。例例如:如:#include class Student public:virtual void print()cout“A student”endl;class GStudent:public Student public:virtual void print()cout“A graduate student”endl;第16页,本讲稿共27页(2 2)一般来)一般来说,可将可将
12、类族中的具有共性的成族中的具有共性的成员函数声明函数声明为虚函数,而具有个性的函数没有必要虚函数,而具有个性的函数没有必要声明声明为虚函数。虚函数。如果在派生如果在派生类中没有重新定中没有重新定义虚函数,虚函数,则派生派生类的的对象将使用基象将使用基类的虚函数的虚函数代代码。静静态成成员函数不能声明函数不能声明为虚函数虚函数。内内联成成员函数不能声明函数不能声明为虚函数。虚函数。因因为对于于内内联成成员函数,在程序函数,在程序编译时,编译系系统就就应明明确用哪个函数体替确用哪个函数体替换内内联函数函数调用的地方,而不用的地方,而不能等到运行能等到运行时再确定再确定调用哪个函数。用哪个函数。第1
13、7页,本讲稿共27页构造函数不能是虚函数。构造函数不能是虚函数。因因为构造函数是在构造函数是在对象象产生之前运行的,而虚函数是使用已有生之前运行的,而虚函数是使用已有对象或其指象或其指针来来调用的函数。所以,将构造函数声明用的函数。所以,将构造函数声明为虚函数虚函数是没有意是没有意义的。的。析构函数可以是虚函数,且往往被定析构函数可以是虚函数,且往往被定义成虚函数。成虚函数。因因为实施多施多态时是通是通过将基将基类的指的指针指向派生指向派生类的的对象来完成的,如果要象来完成的,如果要删除除该指指针所指的所指的派生派生类对象象时就就应该调用用该指指针所指向的派生所指向的派生类的析构函数,然后派生
14、的析构函数,然后派生类的析构函数又的析构函数又调用用基基类的析构函数,的析构函数,这样整个派生整个派生类的的对象才能象才能被完全被完全释放。放。第18页,本讲稿共27页5.4 抽象类抽象类n有时在声明一个基类时无法为虚函数定义其具有时在声明一个基类时无法为虚函数定义其具体实现,这时可以将其声明为一个体实现,这时可以将其声明为一个纯虚函数纯虚函数。包含纯虚函数的类称为抽象类包含纯虚函数的类称为抽象类。例如:例如:class Shapes protected:int x,y;public:void setvalue(int d,int w=0)x=d;y=w;virtual void disp()
15、=0;第19页,本讲稿共27页class Shapes protected:int x,y;public:void setvalue(int d,int w=0)x=d;y=w;virtual void disp()=0;n抽象类是一种特殊的类,专门作为基类派生新类,自身无法抽象类是一种特殊的类,专门作为基类派生新类,自身无法实例化,也就是无法定义抽象类的对象,它为一类族提供统实例化,也就是无法定义抽象类的对象,它为一类族提供统一的操作界面。一的操作界面。n抽象类是为了抽象和设计的目的而建立的,可以说,建立抽象类是为了抽象和设计的目的而建立的,可以说,建立抽象类,就是为了通过它多态地使用其中的
16、成员函数。抽象类,就是为了通过它多态地使用其中的成员函数。n抽象类处于类层次的上层,由它派生新类,然后再实例化。抽象类处于类层次的上层,由它派生新类,然后再实例化。第20页,本讲稿共27页 5.4.1 纯虚函数的定义纯虚函数的定义n在在C+C+中,一个中,一个仅为多多态机制提供一个接口而没有任何机制提供一个接口而没有任何实体体定定义的函数,被称的函数,被称为纯虚函数。虚函数。n声明声明纯虚函数的一般格式如下虚函数的一般格式如下:n抽象抽象类只能用作其他只能用作其他类的基的基类,不能用来建立,不能用来建立抽象抽象类对象。抽象象。抽象类不能用作参数不能用作参数类型、函数型、函数返回返回值类型或型或
17、显式式转换的的类型,但可以型,但可以说明或明或定定义抽象抽象类的指的指针或引用,或引用,该指指针或引用可以或引用可以指向抽象指向抽象类的派生的派生类对象,象,进而而实现多多态性。性。virtual ()=0;第21页,本讲稿共27页 例例5-3抽象类的定义和应用抽象类的定义和应用class Shapes protected:int x,y;public:void setvalue(int d,int w=0)x=d;y=w;virtual void disp()=0;class Square:public Shapes public:void disp()cout“area of rectan
18、gle:”x*ysetvalue(10,5);ptr-disp();程序的运行结果为程序的运行结果为:area of rectangular:50第22页,本讲稿共27页习题和实验题习题和实验题项目设计项目设计1-用面向对象方法实现校园信息管理系统用面向对象方法实现校园信息管理系统1 1 系系统分析和分析和设计 校园信息管理系校园信息管理系统的主要功能就是的主要功能就是对在校人在校人员(包括包括学生和教学生和教师)的信息的信息资料料进行管理。行管理。第23页,本讲稿共27页 虽然系然系统有有时需要将教需要将教师和学生分成两部分和学生分成两部分单独管理,但有独管理,但有时也需要将全体人也需要将全
19、体人员作作为一一类对象象进行行统一管理,以提高管理效率。一管理,以提高管理效率。系系统除了能除了能输入人入人员信息、信息、查询和分析信和分析信息以外,息以外,还应能将数据永久保存到磁能将数据永久保存到磁盘中,以中,以免每次运行程序免每次运行程序时重复重复输入。而且以后要用数入。而且以后要用数据据时能将它能将它们从磁从磁盘文件中文件中读出。出。2.2.功能模功能模块设计 根据前面根据前面对校园信息管理系校园信息管理系统基本信息和功能基本信息和功能的需求分析的需求分析,程序中程序中应该至少定至少定义两个两个类:一个是学生一个是学生类student,student,另一个是教另一个是教师类teach
20、erteacher第24页,本讲稿共27页 另外,另外,为了便于了便于对教教师和学生信息和学生信息进行行统一一处理以提高效率,理以提高效率,还可以将学校的所有人可以将学校的所有人员抽象抽象为一个一个PersonPerson类,将,将 studentstudent和和teacherteacher类作作为其派生其派生类。因此,可画出系。因此,可画出系统的的对象模型如下:象模型如下:第25页,本讲稿共27页personperson类类定 义 数据类型描 述namechar数组学生姓名sexchar数组学生性别addresschar数组学生家庭地址birthdayDate(自定义结构)出生日期typeptype(自定义枚举类型)student 或 teachershow虚成员函数输出对象信息read虚成员函数读入对象信息save虚成员函数将对象存入文件Load虚成员函数从文件读入对象第26页,本讲稿共27页表表9-4 9-4 用到的命令所用到的命令所对应的函数及功能描述的函数及功能描述命 令 对应函数功能描述inputinputCMD输入数据outputoutputCMD输出数据savesaveCMD将数据存入文件loadreadCMD将数据从文件读入analyzeanalyzeCMD分析数据exitexitCMD退出系统helphelpCMD显示帮助信息第27页,本讲稿共27页