第8章-多态性和虚函数_第1页
第8章-多态性和虚函数_第2页
第8章-多态性和虚函数_第3页
第8章-多态性和虚函数_第4页
第8章-多态性和虚函数_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学习目标了解静态联编和动态联编的概念

掌握虚函数的定义和调用方法理解纯虚函数和抽象类的概念8.1联编的概念多态性是通过联编来实现的。所谓联编,是把函数调用与适当的函数代码相关联的动作,分为静态联编和动态联编。静态联编在程序执行前完成,在编译阶段决定执行哪个同名函数被调用,这称为静态联编;而在编译阶段不能决定执行哪个同名函数被调用,只有在执行阶段才能依据要处理的对象类型来决定执行哪个类的成员函数,其所支持的多态性称运行时的多态性,称为动态联编。是通过继承和虚函数实现的8.2动态联编和虚函数8.2.1虚函数的定义虚函数的定义格式如下:virtual<返回类型><函数名>(<参数列表>){<函数体>}说明(1)virtual关键字声明的函数称为虚函数。(2)如果某类的一个成员函数声明为虚函数,则意味着该成员函数在派生类中可能有不同的实现。在基类的派生类中就可以定义一个其函数名、参数、返回类型均相同的虚函数。(3)当通过指针或引用来调用该虚函数时,将会采用动态联编的方式。8.2动态联编和虚函数8.2.2虚函数的调用通过对象指针或引用来调用虚函数时,调用到的虚函数由对象指针或对象引用所关联的实际对象所决定。因此,对象指针或引用关联到不同类的对象时,调用到的虚函数就不同,实现了动态多态性。所以,利用虚函数来实现动态多态性,必须满足如下要求:(1)在基类中把成员函数定义为虚函数;(2)在派生类中定义与基类虚函数同名、同参数、同返回类型的成员函数,但函数体不同,以实现对不同对象的操作;(3)在main()函数中,通过对象指针或引用来调用虚函数。8.3纯虚函数和抽象类8.3.1纯虚函数纯虚函数是一种特殊的虚函数,它只有函数的声明,没有具体实现函数的功能,要求各派生类根据实际需要定义自己的版本,纯虚函数的声明格式如下:

virtual<返回类型><函数名>(<参数表>)=0;说明由于纯虚函数没有函数体,所以在派生类中没有重新定义纯虚函数之前,是不可以被调用该函数的,也不可以被继承。8.4静态多态性与动态多态性的比较在C++中,静态多态性具体表现为重载(overload);动态多态性具体表现为纯虚函数和覆盖(override)。另外,前面还提到了隐藏。8.5运算符重载运算符重载其实就是函数的重载,是一种重要的重载多态性。给已有运算符赋予更多的含义,使它能够用于特定类的对象,执行特定的功能,而且使用形式与基本类型数据的形式相同。C++语言支持运算符重载,但许多高级语言(如Java语言)并不支持运算符重载。8.5.1运算符重载的一般规则运算符是C++系统内部定义的,它们具有特定的语法规则,如参数说明、运算顺序、优先级别等。因此,运算符重载时必须尊遵守一定的规则,不是所有的运算符都允许重载,C++语言允许重载的运算符如表8-1所示。8.5运算符重载如表8-1所示。8.5运算符重载运算符重载时必须遵守如下原则:1.重载的运算符是C++已经存在的运算符,不能主观臆造。2.运算符重载不能改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符重载只能重载为双目运算符。3.运算符重载不能改变C++语言中已定义的运算符优先顺序和结合性。4.运算符重载一般不改变运算符的功能。例如,重载的“+”运算符不可以用来计算两个对象的乘积。5.不能重载的运算符有:(1)sizeof()运算符;(2)成员运算符(.);(3)指向成员的指针运算符(*);(4)作用域运算符(::);(5)条件运算符(?:);6.编译程序对运算符重载遵循函数重载的选择规则。8.5运算符重载8.5.2运算符重载为成员函数运算符重载为类的成员函数的一般形式为:<类型><类名::>operator<运算符>([<形参表>]){

函数体;}说明(1)“类型”是作为函数的返回类型;(2)“类名”是重载该运算符的类;(3)“operator”是关键字,是重载运算符的标志;(4)“运算符”是要重载的运算符;(5)“形参表”表示该运算符所需要的操作数,双目运算符重载为类的成员函数,它们包含一个形参,即运算符右则的操作数。8.5运算符重载1.双目运算符重载为类成员函数双目运算符有两个操作数,通常在运算符的左右两侧,如a+b,a<b等。在重载双目运算符函数中,一个操作数是对象本身的数据,由this指针给出,另一个操作数则需要通过运算符重载函数的参数表来传递。2.单目运算符重载为类成员函数单目运算符中有一个操作数,如!a,-b,&c,++i等,重载单目运算符的方法与重载双目运算符的方法类似。但由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,且可以省略此参数。因为操作数由对象的this指针给出,就不需要任何参数。8.5运算符重载8.5.3运算符重载为友元函数运算符重载为类的友元函数的一般形式如下:friend<类型>operator<运算符>(<形参表>){

函数体;}说明(1)“类型”是作为函数的返回类型;(2)“operator”是关键字,是重载运算符的标志;(3)“运算符”是要重载的运算符;(4)“形参表”表示该运算符所需要的参数和类型;(5)“friend”是运算符重载为友元函数时,在函数类型说明之前使用的关键字。8.5运算符重载1.双目运算符重载为类的友元函数重载为类的友元函数时,将没有隐含的参数this指针。这样,对于双目运算符,友元函数有两个参数。友元函数无需利用对象或其指针进行调用,但它可以自由地访问对象的私有成员。2.单目运算符重载为类的友元函数单目运算符重载为类的成员函数时,一般不需要显示说明参数。因为重载为类的成员函数时,总是隐含一个参数,该参数是this指针。当重载为类的友元函数时,由于不存在隐含的this指针,所以对单目运算符来说,友元函数必须有一个参数。8.6情景应用——训练项目8.6.1项目1:抽象类的应用实例

【问题描述】利用抽象类提供统一接口技术,编写一个程序计算正方形、球体和圆柱体的表面积和体积。【算法设计】(1)从正方形、球体和圆柱体的各种运算中抽象出一个公共基类container为抽象基类。(2)在抽象基类中,定义求表面积和体积的2个纯虚函数。抽象类中定义一个公共的数据成员radius,可作为球的半经、正方体边长、圆柱体的底面半经。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论