- 1、本文档共63页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多态性 多态性的定义 联编 两种多态性 运行时的多态性 6.2 虚函数 6.2.1 为什么要引入虚函数 6.2.2 虚函数的定义与使用 6.2.1 为什么要引入虚函数 指向基类对象的指针都可以指向它的公有派生类对象,若试图指向它的私有派生类对象是被禁止的。 不能将一个声明为指向派生类对象的指针指向其基类的一个对象。 指向派生类的指针不能继承。也就是说,基类的指针可以指向它的派生类,但不能再指向它的派生类的派生类。 声明为指向基类对象的指针,当它指向公有派生类对象时,只能利用它来直接访问派生类中从基类继承来的成员,不能直接访问公有派生类中特定的成员。若想访问其公有派生类的特定成员,可以将基类指针显式类型转换为派生类指针来实现。 6.2.2 虚函数的定义与使用 1.虚函数的定义 虚函数是引入了派生概念后,用来表现基类和派生类的成员函数之间的一种关系的。虚函数定义是在基类中进行的(virtual),虚函数提供了一种接口界面。在基类中的某个成员函数被声明为虚函数后,此虚函数就可以在一个或多个派生类中被重新定义。在派生类中重新定义虚函数时,都必须与基类中的原型完全相同。 虚函数是一种非静态的成员函数,说明虚函数的方法如下: virtual 〈类型〉〈函数名〉(〈参数表〉) 6.2.2 虚函数的定义与使用 如果在基类中定义了一个虚函数,该虚函数可以在它的一个或多个派生类中重载,不用冠以virtual也自动成为虚函数。 举例 虚函数的使用说明 在基类中,使用关键字virtual。把public和protected部分的成员函数声明为虚函数。 在派生类中重新定义虚函数时,函数的返值类型和参数应该同基类中的虚函数完全一致。如果参数不同,属于一般的函数重载,不自动为虚函数。如果仅返值类型不同,产生一个错误,既非重载函数,也非虚函数。 举例 虚函数的使用说明 虚函数的重载函数仍是虚函数。若在基类中声明了一个虚函数,派生类重载该成员函数时无需使用virtual,重载的成员函数自动成为虚函数。 若在派生类中没有重新定义虚函数,派生类对象将使用从基类继承的虚函数。 虚函数必须是类的成员函数,不能是友元函数,也不能是静态成员函数。 析构函数可以是虚函数,但是构造函数不可以是虚函数。 虚函数的使用说明 如果基类中定义了虚函数,使用基类指针调用基类的一个虚函数时,C++系统对该调用进行动态绑定,根据指针当前指向的对象类型,来确定该调用的函数。然而,调用普通函数时,则是静态绑定,编译时就确定该调用的函数。 在多重继承下,对虚函数的调用与单一继承的情况相似。(举例) 举例 运行时的多态性的作用 运行时的多态性,使得我们可以使用基类指针分别指向多个不同派生类的对象,以此来调用不同功能的函数。 举例 举例 空的虚函数 派生类并不一定必须实现基类中的虚函数,如果派生类想通过虚函数机制存取虚函数,则必须建立一条从基类到派生类的虚函数路径。许多没有使用虚函数的中间类也必须声明该函数,以保证其后的派生类能使用该虚函数。可以通过声明空函数来达到此目的。 空的虚函数(举例) 空的虚函数(举例) 可以考虑:如果去掉son类的空虚函数,程序运行结果如何?如果去掉virtual关键字,程序运行结果又如何?如果保留son类的空虚函数,去掉grandson类的虚函数定义,程序运行结果又如何?如果把son类的虚函数定义为cout“class son!\n”,之后去掉grandson类的虚函数定义,程序的运行结果又如何 ? 6.3.1 纯虚函数的概念 ? 有时,基类仅表示一种抽象的概念,并不与具体的事务相联系。于是,在基类中说明的虚函数只是为了给它的派生类提供一个公共的界面。这样虚函数在基类中没定义,也没有函数体。在派生类中需要根据具体情况来定义重载虚函数的功能。在这种情况下,可以将基类中的虚函数定义成纯虚函数。纯虚函数是一种没有具体实现的特殊的虚函数。一个基类中有一个纯虚函数时,则在它的派生类中至少有一个虚函数,否则纯虚函数是无意义的。 6.3.1 纯虚函数的概念 ? 纯虚函数的定义格式如下: virtual 〈类型〉(函数名)(参数表)=0; “=0”不表示函数返回值为0,只起形式上的作用,告之系统这是“纯虚函数”。 由于纯虚函数所在的类中没有它的定义,不具备函数的功能,在该类的构造函数、析构函数及其它函数中不允许调用纯虚函数,否则会导致程序运行错误。 作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行重新定义。 6.3.1 纯虚函数的概念(举例) 6.3.2 抽象类的概念 ?1.抽象类和具体类的概念 如果一个类至少有一个纯虚函数,那么就称该类为抽象类。能够建立实例化
文档评论(0)