- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
11章 多态
第11章 多态 多态性是面向对象设计语言的基本特征。仅仅是将数据和函数捆绑在一起,进行类的封装,使用一些简单的继承,还不能算是真正应用了面向对象的设计思想。多态性是面向对象的精髓。多态性可以简单地概括为“一个接口,多种方法”,前面讲过的函数重载就是一种简单的多态,一个函数名(调用接口)对应着几个不同的函数原型(方法)。 11.1 多态与虚函数 更通俗地说,多态性是指同一个操作作用于不同的对象就会产生不同的响应;多态性分为静态多态性和动态多态性,其中函数重载和运算符重载属于静态多态性, 虚函数属于动态多态性。函数重载和运算符重载在前面已经讲过,虚函数是本章的重点,C++是依靠虚函数来实现动态多态的。在进一步讲述多态前,先来看几个概念。 11.1.1 静态联编 程序调用函数时,具体应使用哪个代码块是由编译器决定的。举函数重载为例,C++编译器根据传递给函数的参数和函数名决定具体要使用哪一个函数,称为联编(binding)。编译器可以在编译过程中完成这种联编,在编译过程中进行的联编叫静态联编(static binding)或早期联编(early binding)。 11.1.2 动态联编 在一些场合下,编译器无法在编译过程中完成联编,必须在程序运行时完成选择,因此编译器必须提供这么一套称为“动态联编”(dynamic binding)的机制,也叫晚期联编(late binding),C++通过虚函数来实现动态联编。 11.1.3 为什么需要虚函数 结合一段示例代码11-1来看一下虚函数的作用,以帮助读者理解多态的意义所在。 11.1.4 虚函数的声明和定义 虚函数的定义很简单,只要在成员函数原型前加一个关键字virtual即可。如果一个基类的成员函数定义为虚函数,那么,它在所有派生类中也保持为虚函数,即使在派生类中省略了virtual关键字。换言之,一个虚函数是属于其所在的类层次的,不仅仅属于其定义所在类,只不过是它在该类层次结构中的不同类中有不同的形态。一旦一个函数被声明为虚函数,不管经历多少次派生,仍将保持其虚特性,即使在派生类中没有使用virtual关键字,其仍然是虚函数。 派生类中可根据需要对虚函数进行重定义,重定义的格式有一定的要求: 与基类的虚函数有相同的参数个数; 其参数的类型与基类的虚函数的对应参数类型相同; 其返回值或者与基类虚函数的相同,或者都返回指针(或引用),并且派生类虚函数所返回的指针(或引用)类型是基类中被替换的虚函数所返回的指针(或引用)类型的子类型(派生类型)。 11.2 虚函数的访问 对虚函数的访问方式不同,程序具体调用哪个函数可能也会有所不同,为了方便说明,本节统一采用如下类层次: 11.2.1 对象名访问 和普通函数一样,虚函数一样可以通过对象名来调用,如代码11-2: 11.2.2 指针访问 使用指针访问非虚函数时,编译器根据指针的类型决定要调用哪个函数,而不是根据指针指向的对象类型,而使用指针访问虚函数时,编译器根据指针所指对象的类型来实现动态联编,具体采用哪个函数与指针的类型无关。使用指针访问是虚函数调用的最主要形式,来看一段示例代码11-3: 11.2.3 引用访问 使用引用访问虚函数,与使用指针访问虚函数类似,不同的是,引用已经声明,不能修改,因此在使用上有一定限制,但这在一定程度上提高了代码的安全性,特别体现在函数参数传递等场合中,可以将引用理解成一种“受限制的指针”,如代码11-4: 11.2.4 类内访问 在类内的成员函数中访问该类层次中的虚函数,要使用this指针。 11.2.5 在构造函数或析构函数中访问 构造函数和析构函数是特殊的成员函数,在其中访问虚函数时,C++采用静态联编,即在构造函数或系统函数内,即使是使用“this-虚函数名”的形式来调用,编译器仍将其解释为静态联编的“本类名::虚函数名”。 举例来说: 11.3 纯虚函数与抽象类 当在基类中无法为虚函数提供任何有实际意义的定义时,可以将该虚函数声明为纯虚函数,它的实现留给该基类的派生类去做。 11.3.1 纯虚函数的声明和定义 纯虚函数是一种特殊的虚函数,它的一般格式如下: class 类名 { virtual 类型 函数名 (参数表)=0; … }; 纯虚函数不能被直接调用,仅提供一个与派生类一致的接口。 11.3.2 抽象类 一个类可以包含多个纯虚函数。只要类中含有一个纯虚函数,该类便为抽象类。一个抽象类只能作为基类来派生新类,不能创建抽象类的对象,如中的A类便是抽象类,创建A类的对象是非法的,如: A a; //错误:A为抽象类 但可声明一个指向抽象类的指针,如: A* a=NULL; A* a=new B; 应注意:“A* a=new A;”非法,因为该语句试图创
文档评论(0)