欢迎来到天天文库
浏览记录
ID:50350137
大小:698.50 KB
页数:17页
时间:2020-03-08
《C++程序设计 教学课件 作者 白伟青 等 第9章.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第9章多态性9-1多态性概述9-2虚函数9-3纯虚函数和抽象类9-4虚析构函数19-1多态性概述多态就是指不同的对象接收到相同的消息时产生不同的行为,即对应相同的函数名,却执行了不同的函数体。29-1多态性概述1.编译时多态(静态联编)函数重载的3种方式如下。(1)外部函数重载:通过参数的个数或参数的类型区别函数。(2)在同一类中重载:通过参数的个数或参数的类型区别函数。(3)基类成员函数在派生类中的重载。39-1多态性概述2.运行时多态(动态联编)动态联编是系统在运行时动态判断对象类型,根据对象实际的类型来动态决定调用哪个对象的函数的机制。49-
2、2虚函数9-2-1虚函数的声明9-2-2使用虚函数9-2-3动态联编的实现59-2虚函数9-2-1虚函数的声明虚函数是C++中用于实现多态的机制,其核心理念就是通过基类指针访问派生类中定义的函数。虚函数是在基类中冠以关键字virtual的成员函数,其声明的一般格式为:virtual类型函数名(参数表);69-2-1虚函数的声明说明:(1)如果某类中的一个成员函数被说明为虚函数,这就意味着该成员函数在派生类中可能有不同的实现。通过基类指针可以访问派生类对象成员函数。(2)虚函数可以在一个或多个派生类中被重新定义。在派生类中重新定义虚函数时必须有相同的
3、函数原型,包括返回类型、函数名、参数个数及参数类型的顺序必须相同。79-2-1虚函数的声明(3)一旦一个函数在基类中第一次声明时使用了virtual关键字,那么,当派生类重载该成员函数时,无论是否使用了virtual关键字,该成员函数都将被看作一个虚函数,也就是说,虚函数的重载函数仍是虚函数。(4)只有类的成员函数才能说明为虚函数。因为虚函数只适用于有继承关系的类对象,所有普通函数不能说明为虚函数。89-2-1虚函数的声明(5)静态成员函数不能声明为虚函数,因为静态成员函数不属于某个对象。(6)内联函数不能是虚函数。因为内联函数不能在运行时动态确定
4、其位置,即使虚函数在类的内部定义,编译时,也应将其看作是非内联的。99-2-1虚函数的声明(7)析构函数可以是虚函数,但构造函数不能为虚函数。(8)如果一个成员函数需要在派生类里有不同的表现,那么应该在基类中把此函数定义为虚函数。(9)一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。(10)虚函数与重载函数的比较。109-2-2使用虚函数C++规定,必须采用指向基类对象的指针变量或引用基类对象的引用变量调用虚函数才能实现动态联编,若使用对象来调用虚函数则采用静态联编,从而不具备多态性。119-2-3动态联
5、编的实现在C++语言中动态联编是通过使用虚函数表(VirtualFunctionTable)来实现的。编译器发现一个类中有被声明为virtual的函数,就会为其生成一个虚函数表,也就是VFTABLE。129-3纯虚函数和抽象类纯虚函数是指被标明为不具体实现的虚成员函数。声明一个函数是纯虚函数,是让C++知道该函数无定义,是为派生类而保留的位置,期待派生类用一个具体的函数来重载该函数。定义纯虚函数的一般形式为:virtual返回值类型函数名(参数表)=0;139-3纯虚函数和抽象类说明:(1)纯虚函数是一个在基类中说明的虚函数,它在基类中没有定义,要
6、求任何派生类都定义自己的版本。纯虚函数为各派生类提供一个公共界面。(2)从基类继承来的纯虚函数,在派生类中仍是虚函数。(3)抽象类只能作为其他类的基类,不能声明抽象类的实例,也不能用抽象类作为参数类型、函数返回值类型或显式转换的类型。但是,可以声明抽象类的指针和引用。149-3纯虚函数和抽象类(4)在从抽象类派生出的新类中,必须重新定义其父类的每个纯虚函数;或者把这些函数继续声明为纯虚函数,这样做派生类也就成为抽象类。(5)可以由抽象类派生出具体类,但是不能由具体类派生出抽象类。(6)在抽象类中也可以定义普通成员函数或虚函数,虽然不能为抽象类声明对
7、象,但仍然可以通过派生类对象来调用这些不是纯虚函数的函数。159-4虚析构函数在析构函数前面加上关键字virtual进行说明,称该析构函数为虚析构函数。析构函数也可以是纯虚的。例如:classA{public:virtual~A()=0;//纯虚析构函数};16习题1.解释面向对象程序设计中的多态性的含义。2.C++系统支持哪两种多态性?3.在C++中函数重载的3种方式是什么?4.说明动态联编的实现需要的3个条件?5.什么是虚函数?为什么要引入虚函数的概念?17
此文档下载收益归作者所有