第7章虚函数和多态性.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第7章 虚函数和多态性 虚函数 纯虚函数和抽象类 普通成员函数重载 7.1.2 派生类指针 7.1.3 虚函数与多态性 小 结 虚函数的声明:class 基类 { … virtual 返回值类型 成员函数名 ( 形参表 ) { 函数体 } }; 当一个基类的某成员函数声明为虚函数,则在该基类的所有派生类中,与虚函数同名、参数个数及类型相同、且返回值类型也相同的,不论是否有关键字 virtual 修饰,都是虚函数。但要注意:若在派生类中只是与虚函数同名,而参数个数或类型有不同时,属于函数重载,不是虚函数! 构造函数、静态成员函数不能声明为虚函数!析构函数可以声明为虚函数。 如何体现虚函数的特性?只有通过基类的对象指针、基类的对象引用来调用派生类对象的虚函数时,才能体现虚函数的特性!而通过派生类对象的对象名、对象指针、对象引用来调用虚函数时,无法体现虚函数的特性! 派生类对象中虚函数的调用━━方法㈠: 派生类对象的虚函数也是成员函数,可按一般成员函数的方式调用!即:可通过派生类对象的对象名、对象指针、对象引用来调用!调用过程与一般成员函数的调用过程相同!由此可见,这种调用方式无法体现虚函数的特性! 派生类对象中虚函数的调用━━方法㈡: 可通过基类的对象指针、基类的对象引用来调用派生类对象的虚函数!调用过程:调用的是派生类中的虚函数!若派生类中没有重新定义该虚函数,则调用的是上一层基类中的该虚函数;若在这一层基类中也没有重新定义该虚函数,就继续往上一层寻找 … ,直至基类的对象指针、基类的对象引用它们本身所属的那一层基类! 动态多态性的实现:可以让基类的对象指针(或基类的对象引用)先后指向(或先后引用)同一类族中不同派生类的对象,以便用相同的调用方式去调用不同派生类对象中的同名虚函数,从而实现动态多态性。 虚析构函数的声明:若将基类的析构函数声明为虚函数,则由该基类派生的所有派生类的析构函数都自动成为虚函数,即使这些派生类的析构函数名与基类的析构函数名并不相同! 必须声明虚析构函数的情况:在由一个基类派生出的类体系中,若需要动态创建派生类对象,就必须将析构函数声明为虚函数,以实现撤消对象时的多态性!这样,若程序中用 delete 运算符去撤消动态分配的派生类对象,而 delete 运算符后面跟着的是指向派生类对象的基类指针,则系统调用的不是基类的析构函数,而是派生类的析构函数! 习惯的做法:一般在基类中都将析构函数声明为虚析构函数,即使基类并不需要自定义析构函数时,也显式定义一个函数体为空的虚析构函数,以保证在撤消动态分配的派生类对象时能得到正确的处理。 纯虚函数:定义一个基类时,若无法给出某虚函数的具体实现,则在基类中将该虚函数声明为纯虚函数。要求任何派生类都重新定义自己的版本。 纯虚函数为各派生类提供一个公共界面 纯虚函数的声明: class 抽象类 { … virtual 返回值类型 成员函数名 ( 形参表 )= 0 ; }; 因为无法给出纯虚函数的具体实现,所以没有函数体,但不是函数体为空!函数体为空的函数称为空函数,调用空函数时,不执行任何操作。 将函数名赋值为0,本质上是将指向函数体的指针赋值为0。在派生类中没有重新定义纯虚函数之前,是不能调用这种函数的! ? 如果一个类中至少有一个纯虚函数,则该类称为抽象类 ? 抽象类只能用作其他类的基类,抽象类不能建立对象 ? 抽象类不能用作参数类型、函数返回类型或显式转换的类型 ? 可以声明抽象类的指针和引用 * 重载是多态性的一种简单形式。 普通成员函数重载可表达为两种形式: 1. 在一个类说明中重载 例如: Show ( int , char ) ; Show ( char * , float ) ; 2. 在不同类中重载 3. 基类的成员函数在派生类重载。 重载是多态性的一种简单形式。 普通成员函数重载可表达为两种形式: 例如: Show ( int , char ) 与 Show ( char * , float ) 不是同一函数,编译能够区分 (1)根据参数的特征加以区分 普通成员函数重载 有 3 种编译区分方法: 重载是多态性的一

文档评论(0)

kabudou + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档