网站大量收购独家精品文档,联系QQ:2885784924

C++(谭浩强)笔记(第12讲).pdf

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多态性和虚函数 一、多态性的概念 多态性(polymorphism)是面向对象的一个重要特征。顾名思义,多态的意思 就是一个事物有多种形态。在面向对象方法中一般是这样表述多态性的:向不同 的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。 在C++ 中,多态性的表现形式之一是:具有不同功能的函数可以用同一个函 数名,这样就可以实现用一个函数名调用不同内容的函数。因此,函数重载、运 算符重载都是多态现象。 从系统角度看,多态性分为两类:静态多态性和动态多态性。静态多态性是 通过函数重载实现的。由函数重载和运算符重载形成的多态性称为静态多态性是 因为在编译时就知道调用函数的全部信息,因此,在程序编译时系统就能决定调 用哪个函数,所以静态多态性又称为编译时的多态性。静态多态性的函数调用速 度快、效率高,但缺乏灵活性,在程序运行前就已经决定了执行的函数和方法。 动态多态性的特点是:不在编译时确定调用哪个函数,而在程序运行过程中 才动态的确定操作所针对的对象。因而又称为运行时的多态性。动态多态性是通 过虚函数(virtual function)实现的。 二、一个典型的例子 例:先建立一个Point 类,包含数据成员x,y(坐标点)。以它为基类,派 生出一个Circle 类,增加数据成员半径r;在以Circle 类为基类,派生出一个 Cylinder 类,增加数据成员高h,要求编写程序,重载运算符“”和“”使 之能用于输入和输出以上对象。 图1:承上启下的典型例子 三、利用虚函数实现动态多态性 1、虚函数的作用 C++ 中虚函数是用来解决动态多态问题的。所谓虚函数,就是在基类声明函 数是虚拟的,并不是实际存在的函数,然后在派生类中才正式定义此函数。在程 序运行期间,用指针指向某一派生类对象,这样就能调用指针指向的派生类对象 中的函数。虚函数的作用就是允许在派生类中重新定义与基类同名的函数,并且 可以通过基类指针或引用来访问基类和派生类中的同名函数。 例:当基类和派生类中有同名函数且不使用虚函数,其程序如图2 所示。 图2:基类和派生类中有同名函数 分析程序运行结果发现,对象grad 的数据成员并没有被全部输出,说明在 需要输出grad 对象的数据成员时并没有调用Graduate 类的display 函数,而是 调用了父类Student 中的display 函数。这是因为基类指针本来是用来指向基类 对象的,如果用它来指向派生类对象就会自动进行指针类型转换,将派生类对 象的指针先转换为基类的指针,这样基类指针实际上指向的是派生类对象中的 基类部分。所以会出现这样的结果。 如果在Student 类中声明display 函数时加上关键字virtual,将Student 中的display 函数声明为虚函数,则运行结果如图3 所示。 图3:将基类中的display 函数声明为虚函数后的运行结果 分析结果可以发现,现在用同一个指针变量(指向基类对象)不但输出了 stud 对象中的全部数据,而且还输出了 grad 对象中的全部数据,当然如果 Student 类的其他派生类中还有同名函数display,同样可以用这个指向基类对 象的指针输出其他派生类对象中的所有成员。这是因为把基类的某个成员函数声 明为虚函数后,允许在其派生类中对该函数重新定义,赋予新的功能,并且可以 通过指向基类对象的指针指向同一类族中不同类的对象,从而调用其中的同名函 数。这样,就达到了同一类族中的不同类的对象,对同一函数调用做出不同响应 的效果,这就是动态多态性。 2、虚函数的使用方法 (1)在基类中用virtual 声明为虚函数,如果在类外定义不必再加virtual; (2)在派生类中重新定义此函数,函数名、函数类型、函数参数类型和个数必 须与虚函数相同,然后根据派生类的需要重新定义函数体。(注:当一个成员函 数被声明为虚函数后,其派生类中的同名函数都自动称为虚函数。在派生类中 重新声明该虚函数时,为了使程序更加清晰,建议加上 virtual);(3)定义一 个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象;(4) 通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数; 值得注意的是:函数重载和虚函数处理的都是同名函数问题,他么的不同之处在 于函数重载处理的是同一层次上的同名函数问题,而虚函数处理的是不同派生 层次上的同名函

文档评论(0)

xiaofei2001128 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档