第6 多态性与虚函数.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文档。上传文档
查看更多
第6 多态性与虚函数

第6章 多态性与虚函数 6.1多态性的概念 多态性是面向对象的重要特性之一,是指不同对象收到相同的消息时产生不同的行为。消息是指调用类的成员函数,不同的行为指不同的实现,即调用不同的函数; C++支持两种多态性:编译时的多态性(静态多态性)和运行时的多态性(动态多态性); 编译时的多态是指在编译阶段就决定调用哪个同名函数,通过函数重载来实现。 动态多态性是在程序运行过程中才动态地确定操作所针对的对象。动态多态性是通过虚函数实现的。 6.2一个典型的例子 在本例中存在静态多态性,这是运算符重载引起的(注意3个运算符函数是重载而不是同名覆盖,因为有一个形参类型不同)。 可以看到,在编译时编译系统即可以判定应调用哪个重载运算符函数。 6.3虚函数 在许多时候,对象及对象的操作不能在编译时就确定下来,需要在运行过程中确定。 这种动态多态性是用虚函数来实现的。 6.3.1虚函数的作用 基类成员函数在派生类中重载 函数名相同,只是它们属于不同的类。如果在派生类中声明了与基类成员函数同名的新函数,则从基类继承的同名函数的所有重载形式都会被覆盖,即使函数的参数表不同。 区分这种函数的方式有两种: (1) 使用“类名::”加以区分(限定作用域); 例: Circles::show 和 Point::show (2) 根据对象加以区分; 例:Circles Acircle; Point Apoint; Acircle.show( ); Apoint.show( ); 虚函数的作用 若要基类指针访问派生类中相同名字的函数,必须将基类中的同名函数定义为虚函数,这样,将不同的派生类对象的地址赋给基类的指针变量后,就可以动态地根据这种赋值语句调用不同类中的函数。 虚函数 在类的声明中,在函数原型之前写virtual。 virtual 只用来说明类声明中的原型,不能用在函数实现时。 具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。 本质:不是重载声明而是覆盖。 调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数。 虚函数的定义 定义格式为: virtual type FuncName(ArgList); 注:一旦把基类的成员函数定义为虚函数,由基类所派生出来的所有派生类中同名的函数均自动成为虚函数,可以不用关键字virtual来修饰这个成员函数 。 用基类指针访问与用对象名访问虚函数的区别 用基指针访问虚函数时,指向其实际派生类对象重新定义的函数,实现动态绑定。 通过一个对象名访问时,只能静态绑定,即由编译器在编译的时候决定调用哪个函数。 关于虚函数的几点说明 当在基类中把成员函数定义为虚函数后,在其派生类中定义的虚函数必须与基类中的虚函数同名,参数的类型、顺序、参数的个数必须一一对应,函数的返回的类型也相同。若函数名相同,但参数的个数不同或者参数的类型不同时,则属于函数的重载,而不是虚函数。若函数名不同,显然这是不同的成员函数。 实现这种动态的多态性时,必须使用基类指针变量,并使该指针指向不同的派生类对象,并通过调用指针所指向的虚函数才能实现动态的多态性。 虚函数必须是类的一个成员函数,不能是友元函数,也不能是静态的成员函数。 在派生类中没有重新定义虚函数时,与一般的成员函数一样,当调用这种派生类对象的虚函数时,则调用其基类中的虚函数。 可把析构函数定义为虚函数,但是,不能将构造函数定义为虚函数。 6.3.2静态关联与动态关联 函数重载和通过对象名调用的虚函数,在编译时即可确定其调用的虚函数属于哪一个类,其过程称为静态关联。 在运行阶段把虚函数和对象“绑定”在一起,此过程称为动态关联。 6.3.3在什么情况下应当声明虚函数 应考虑对成员函数的调用是通过对象名还是通过基类指针或引用去方访问,如果是通过基类指针或引用去访问的,则应当声明为虚函数。 定义抽象类时应当声明虚函数。 注:虚函数与一般的成员函数相比较,调用时的执行速度要慢一些。为了实现多态性,在每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也是间接实现的。因此,除了要编写一些通用的程序,并一定要使用虚函数才能完成其功能要求外,通常不必使用虚函数。 6.3.4虚析构函数 将析构函数声明为虚函数,可以正确地执行析构函数,即先调用派生类的析构函数,再调用基类的析构函数; 当基类的析构函数为虚函数时,无论指针指向同一类族中的哪个对象,系统都会调用相应的析构函数,否则系统只会执行基类的析构函数而不执行派生类的析构函数; 6.4纯虚函数与抽象类 有时在基类中将某一成员函数定为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数

文档评论(0)

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

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

版权声明书
用户编号:7065201001000004

1亿VIP精品文档

相关文档