自考c++课件第八章

上传人:飞*** 文档编号:51653027 上传时间:2018-08-15 格式:PPT 页数:59 大小:342.50KB
返回 下载 相关 举报
自考c++课件第八章_第1页
第1页 / 共59页
自考c++课件第八章_第2页
第2页 / 共59页
自考c++课件第八章_第3页
第3页 / 共59页
自考c++课件第八章_第4页
第4页 / 共59页
自考c++课件第八章_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《自考c++课件第八章》由会员分享,可在线阅读,更多相关《自考c++课件第八章(59页珍藏版)》请在金锄头文库上搜索。

1、第八章多态性和虚函数8.18.1多态性多态性相同调用形式产生多种调用结果,函数定义、调相同调用形式产生多种调用结果,函数定义、调 用时的多种形式称为多态性用时的多种形式称为多态性函数重载函数重载函数默认参数函数默认参数继承派生继承派生1 18.1.18.1.1静态联编中的赋值兼容性和名字支配规律静态联编中的赋值兼容性和名字支配规律类的对象与该对象调用的函数一一对应,程序编类的对象与该对象调用的函数一一对应,程序编 译时即可确定该对象调用哪一个函数,称为静态译时即可确定该对象调用哪一个函数,称为静态 联编联编通过指向对象的指针和引用调用成员函数时:通过指向对象的指针和引用调用成员函数时: 所调用

2、成员函数为指针和引用所属类的成员函数所调用成员函数为指针和引用所属类的成员函数即由赋值兼容规则决定指针调用的成员函数即由赋值兼容规则决定指针调用的成员函数2 23 38.1.18.1.1静态联编中的赋值兼容性和名字支配规律静态联编中的赋值兼容性和名字支配规律类的对象与该对象调用的函数一一对应,程序编类的对象与该对象调用的函数一一对应,程序编 译时即可确定该对象调用哪一个函数,称为静态译时即可确定该对象调用哪一个函数,称为静态 联编联编存在继承和派生时,如果派生类和基类中均定义存在继承和派生时,如果派生类和基类中均定义 了同名函数,则通过指向派生类对象的基类指针了同名函数,则通过指向派生类对象的

3、基类指针 或通过引用了派生类对象的基类引用调用成员函或通过引用了派生类对象的基类引用调用成员函 数时,系统会调用派生类的成员函数,除非派生数时,系统会调用派生类的成员函数,除非派生 类中未定义同名函数时,才调用基类的成员函数类中未定义同名函数时,才调用基类的成员函数4 48.1.28.1.2动态联编的多态性动态联编的多态性动态连编的多态性是指当程序执行时才能确定指动态连编的多态性是指当程序执行时才能确定指 针或引用所调用的成员函数是基类的还是派生类针或引用所调用的成员函数是基类的还是派生类 的成员函数,在编译时仅检查函数调用是否符合的成员函数,在编译时仅检查函数调用是否符合 赋值兼容规则。赋值

4、兼容规则。要实现程序运行时决定指针所调用的函数是基类要实现程序运行时决定指针所调用的函数是基类 的还是派生类的,即:动态联编。的还是派生类的,即:动态联编。5 58.1.28.1.2动态联编的多态性动态联编的多态性按照赋值兼容规则,如上的调用肯定会调用基类按照赋值兼容规则,如上的调用肯定会调用基类 的的areaarea函数,若要实现如上调用能调用派生类函数,若要实现如上调用能调用派生类 的的areaarea函数则应定义虚函数。函数则应定义虚函数。定义成员函数时,函数首部前加关键字定义成员函数时,函数首部前加关键字virtualvirtual 则定义的成员函数为虚函数则定义的成员函数为虚函数6

5、67 78.1.28.1.2动态联编的多态性动态联编的多态性另外:另外:若基类的函数若基类的函数f f定义为虚函数,则派生类中与基定义为虚函数,则派生类中与基 类中同名的函数类中同名的函数f f(函数返回值、参数也相同)(函数返回值、参数也相同) 自动为虚函数自动为虚函数虚函数的特点就是动态联编的。虚函数的特点就是动态联编的。调用规则:调用规则: 根据当前对象,优先调用对象本身的虚函数。根据当前对象,优先调用对象本身的虚函数。8 8虚函数的特点就是动态联编的。虚函数的特点就是动态联编的。通过刚才程序我们知道:通过刚才程序我们知道:若将基类成员函数若将基类成员函数f f定义为虚函数,定义为虚函数

6、, 并且基类指针指向了派生类对象并且基类指针指向了派生类对象则通过基类指针调用则通过基类指针调用f f函数时,若派生类中未定函数时,若派生类中未定 义义f f函数,则基类指针调用的函数,则基类指针调用的f f函数是基类中的函数是基类中的f f 函数,若派生类中重定义了函数,若派生类中重定义了f f函数,则基类指针函数,则基类指针 调用的调用的f f函数是派生类中的函数是派生类中的f f函数。函数。9 98.28.2虚函数虚函数 虚函数是类的成员函数,且不能是静态成员函数虚函数是类的成员函数,且不能是静态成员函数一旦基类中定义了虚函数,则该类的派生类中的一旦基类中定义了虚函数,则该类的派生类中的

7、 同名函数(函数返回值类型、函数参数也相同)同名函数(函数返回值类型、函数参数也相同) 自动为虚函数。自动为虚函数。构造函数不可定义为虚函数构造函数不可定义为虚函数析构函数可定义为虚函数析构函数可定义为虚函数10108.28.2虚函数虚函数8.2.18.2.1虚函数的定义:虚函数的定义:Class A Class A PublicPublic:virtual void fvirtual void f()() ; Class BClass B:public A public A PublicPublic:void fvoid f()() ;11118.2.28.2.2虚函数实现多态性的条件虚函数

8、实现多态性的条件使用虚函数不一定产生动态联编使用虚函数不一定产生动态联编假设基类假设基类AA中定义了虚函数中定义了虚函数f f 在派生类在派生类BB中重定义了函数中重定义了函数f f 有有BB类的对象类的对象b b调用函数调用函数f f时,调用的是时,调用的是BB的函数的函数f f或者使用或者使用b.A:fb.A:f();();此时调用的此时调用的f f为为AA的的f f此时为静态联编此时为静态联编12128.2.28.2.2虚函数实现多态性的条件虚函数实现多态性的条件产生运行时多态的条件(动态联编):产生运行时多态的条件(动态联编):1,1,类之间的继承关系满足赋值兼容规则类之间的继承关系满

9、足赋值兼容规则 2,2,重定义了同名虚函数重定义了同名虚函数 3,3,根据赋值兼容规则使用指针或引用根据赋值兼容规则使用指针或引用利用指向派生类的基类指针调用虚函数利用指向派生类的基类指针调用虚函数 利用引用了派生类对象的基类引用调用虚函数利用引用了派生类对象的基类引用调用虚函数用基类引用(基类指针)作函数形参参数时,函用基类引用(基类指针)作函数形参参数时,函 数调用时用派生类对象(或地址)做实参数调用时用派生类对象(或地址)做实参131314141515总结:总结:若将基类成员函数若将基类成员函数f f定义为虚函数,定义为虚函数, 并且基类指针指向了派生类对象并且基类指针指向了派生类对象则

10、通过基类指针调用则通过基类指针调用f f函数时,若派生类中未定函数时,若派生类中未定 义义f f函数,则基类指针调用的函数,则基类指针调用的f f函数是基类中的函数是基类中的f f 函数,若派生类中重定义了函数,若派生类中重定义了f f函数,则基类指针函数,则基类指针 调用的调用的f f函数是派生类中的函数是派生类中的f f函数。函数。一旦基类中定义了虚函数,则该类的派生类中的一旦基类中定义了虚函数,则该类的派生类中的 同名函数(函数返回值类型、函数参数也相同)同名函数(函数返回值类型、函数参数也相同) 自动为虚函数。自动为虚函数。1616产生运行时多态的条件(动态联编):产生运行时多态的条件

11、(动态联编):1,1,类之间的继承关系满足赋值兼容规则类之间的继承关系满足赋值兼容规则 2,2,重定义了同名虚函数重定义了同名虚函数 3,3,根据赋值兼容规则使用指针或引用根据赋值兼容规则使用指针或引用利用指向派生类的基类指针调用虚函数利用指向派生类的基类指针调用虚函数 利用引用了派生类对象的基类引用调用虚函数利用引用了派生类对象的基类引用调用虚函数用基类引用(基类指针)作函数形参参数时,函用基类引用(基类指针)作函数形参参数时,函 数调用时用派生类对象(或地址)做实参数调用时用派生类对象(或地址)做实参17178.2.38.2.3构造函数和析构函数调用虚函数构造函数和析构函数调用虚函数在构造

12、函数和析构函数中调用虚函数时采用静态在构造函数和析构函数中调用虚函数时采用静态 联编,即:当前对象所调用虚函数是自己类中或联编,即:当前对象所调用虚函数是自己类中或 基类中定义的函数,不是派生类中的函数。而且基类中定义的函数,不是派生类中的函数。而且 优先调用自己类中的虚函数。优先调用自己类中的虚函数。1818两个调用规则两个调用规则若已知若已知AA派生派生BB,BB派生派生C C 若若C C类对象调用的成员函数为继承自类对象调用的成员函数为继承自BB类的函数类的函数 f1f1,且,且f1f1函数体内又有成员函数函数体内又有成员函数f2f2调用时,若调用时,若 该函数该函数f2f2是虚函数且在

13、是虚函数且在C C类中有定义时仍然优先类中有定义时仍然优先 调用调用C C类的类的f2f2函数,无论函数,无论AA、BB是否定义了是否定义了f2f2若已知若已知AA派生派生BB,BB派生派生C C 若若C C类对象调用的成员函数为继承自类对象调用的成员函数为继承自BB类的函数类的函数 f1f1,且,且f1f1函数体内又有成员函数函数体内又有成员函数f2f2调用时,若调用时,若 该函数该函数f2f2不是虚函数,则优先调用不是虚函数,则优先调用BB的的f2f2,若,若BB 中没有中没有f2f2定义,则调用定义,则调用AA的的f2f2191920202121222223232424252526262

14、7278.2.38.2.3构造函数和析构函数调用虚函数构造函数和析构函数调用虚函数在构造函数和析构函数中调用虚函数时采用静态在构造函数和析构函数中调用虚函数时采用静态 联编,即:所调用虚函数是自己类中或基类中定联编,即:所调用虚函数是自己类中或基类中定 义的函数,不是派生类中的函数。义的函数,不是派生类中的函数。C+C+中不支持构造函数定义为虚函数,析构函中不支持构造函数定义为虚函数,析构函 数可以定义为虚函数。数可以定义为虚函数。只要基类的析构函数定义虚函数,则派生类的析只要基类的析构函数定义虚函数,则派生类的析 构函数自动为虚函数构函数自动为虚函数28288.2.48.2.4纯虚函数与抽象

15、类纯虚函数与抽象类若虚函数定义时,不给出函数体,定义为如下形若虚函数定义时,不给出函数体,定义为如下形 式:式:class class 类名类名 virtual virtual 函数类型函数类型 函数名(参数)函数名(参数)=0=0; 则称为纯虚函数。则称为纯虚函数。具有纯虚函数的类为抽象类,具有纯虚函数的类为抽象类, 抽象类不可定义对象抽象类不可定义对象29298.2.48.2.4纯虚函数与抽象类纯虚函数与抽象类若虚函数定义时,不给出函数体,定义为如下形若虚函数定义时,不给出函数体,定义为如下形 式:式:class class 类名类名 virtual virtual 函数类型函数类型 函数

16、名(参数)函数名(参数) ; 则称为空虚函数。则称为空虚函数。30308.2.48.2.4纯虚函数与抽象类纯虚函数与抽象类例题:例题: 要求:定义多个类产生多个对象,存放多种形状要求:定义多个类产生多个对象,存放多种形状 ,正方形,矩形,圆,并求各个对象存放的形状,正方形,矩形,圆,并求各个对象存放的形状 的面积,并求各面积之和。的面积,并求各面积之和。3131类的定义类的定义3232类的定义类的定义33338.2.48.2.4纯虚函数与抽象类纯虚函数与抽象类定义各种形状的对象:并求取面积,及面积和定义各种形状的对象:并求取面积,及面积和 square p1(4);square p1(4); circle p2(6);circle p2(6); rectangle p3(4,5);rectangle p3(4,5);sum=p1.area()+p2.area()+p3.area();sum=p1.are

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号