8章多态性 H 第8章多态性 8.1多态性概述 8,2运算符重载 83虚函数 8.4抽象类 BACK
第8章 多态性 第8章 多态性 8.1 多态性概述 8.2 运算符重载 8.3 虚函数 8.4 抽象类
8章多态性 H 81多态性概述 所谓多态性是指同一个接口可以通过多种方法调 用,如图8-1所示。通俗地说,多态性是指用一个相同 的名字定义不同的函数,这些函数的执行过程不同, 但是有相似的操作,即用同样的接口访问不同的函数 比如,一个对象中有很多求两个数中最大值的行为, 虽然可以针对不同的数据类型,写很多不同名称的函 数来实现,但事实上,它们的功能几乎完全相同。这 时,就可以利用多态的特征,用统一的标识来完成这 些功能
第8章 多态性 8.1 多态性概述 所谓多态性是指同一个接口可以通过多种方法调 用,如图8-1所示。通俗地说,多态性是指用一个相同 的名字定义不同的函数,这些函数的执行过程不同, 但是有相似的操作,即用同样的接口访问不同的函数。 比如,一个对象中有很多求两个数中最大值的行为, 虽然可以针对不同的数据类型,写很多不同名称的函 数来实现,但事实上,它们的功能几乎完全相同。这 时,就可以利用多态的特征,用统一的标识来完成这 些功能
8章多态性 H 用户 单一接口名称 方法1 方法n 图8-1多态性为用户提供单一接口示意图
第8章 多态性 图8-1 多态性为用户提供单一接口示意图
H 8章多态性 面向对象的多态性从实现的角度来讲,可以分为 静态多态性和动态多态性两种。静态多态性是在编译 的过程中确定同名操作的具体操作对象的,而动态多 态性则是在程序运行 过程中动态地确定操作所针对的具体对象的。这 种确定操作具体对象的过程就是联编( binding),也称为 绑定。联编是指计算机程序自身彼此关联的过程。也 就是把一个标识符名和一个存储地址联系在一起的过 程。用面向对象的术语讲,就是把一条消息和一个对 象的方法相结合的过程
第8章 多态性 面向对象的多态性从实现的角度来讲,可以分为 静态多态性和动态多态性两种。静态多态性是在编译 的过程中确定同名操作的具体操作对象的,而动态多 态性则是在程序运行 过程中动态地确定操作所针对的具体对象的。这 种确定操作具体对象的过程就是联编(binding),也称为 绑定。联编是指计算机程序自身彼此关联的过程。也 就是把一个标识符名和一个存储地址联系在一起的过 程。用面向对象的术语讲,就是把一条消息和一个对 象的方法相结合的过程
8章多态性 H 所谓消息,是指对类的成员函数的调用。不同的 方法是指不同的实现,也就是调用了不同的函数。按 照联编进行阶段的不同,联编方法可以分为两种:静 态联编和动态联编。这两种联编过程分别对应着多态 的两种实现方式。联编工作在编译连接阶段完成的情 况称为静态联编。在编译、连接过程中,系统就可以 根据类型匹配等特征确定程序中操作调用与执行该操 作的代码的关系,即确定某一个同名标识到底是要调 用哪一段程序代码。函数重载和运算符重载就属于静 态多态性
第8章 多态性 所谓消息,是指对类的成员函数的调用。不同的 方法是指不同的实现,也就是调用了不同的函数。按 照联编进行阶段的不同,联编方法可以分为两种:静 态联编和动态联编。这两种联编过程分别对应着多态 的两种实现方式。联编工作在编译连接阶段完成的情 况称为静态联编。在编译、连接过程中,系统就可以 根据类型匹配等特征确定程序中操作调用与执行该操 作的代码的关系,即确定某一个同名标识到底是要调 用哪一段程序代码。函数重载和运算符重载就属于静 态多态性
8章多态性 H 和静态联编相对应,如果联编工作在程序运行阶段 完成,则称为动态联编。在编译、连接过程中无法解决 的联编问题,要等到程序开始运行之后再来确定。例如, 本章将要介绍的虚函数就是通过动态联编完成的 函数重载在函数及类的章节中曾做过详细的讨论, 所以在本章中,静态多态性主要介绍运算符重载;对于 动态多态性,将对虚函数作详细介绍。 BACK
第8章 多态性 和静态联编相对应,如果联编工作在程序运行阶段 完成,则称为动态联编。在编译、连接过程中无法解决 的联编问题,要等到程序开始运行之后再来确定。例如, 本章将要介绍的虚函数就是通过动态联编完成的。 函数重载在函数及类的章节中曾做过详细的讨论, 所以在本章中,静态多态性主要介绍运算符重载;对于 动态多态性,将对虚函数作详细介绍
8章多态性 H 8.2运算符重载 C艹中预定义的运算符的操作对象只能是基本数据 类型。实际上,对于很多用户自定义的类型(如类),也 需要有类似的运算操作。例如,下面的程序声明了一个 点类 point classpoint / point类声明 private intx
第8章 多态性 8.2 运算符重载 C++中预定义的运算符的操作对象只能是基本数据 类型。实际上,对于很多用户自定义的类型(如类),也 需要有类似的运算操作。例如,下面的程序声明了一个 点类point。 classpoint //point类声明 { private: intx,y;
8章多态性 H public ∥构造函数 point(intxx-=0, intyy-=OxXX; y=yy intet XO ∥示x值 intet yo 显示y值
第8章 多态性 public: //构造函数 point(intxx=0,intyy=0){x=xx;y=yy;} intget_x(); //显示x值 intget_y(); //显示y值 //... };
8章多态性 H 于是我们可以这样声明点类的对象: pointpl(l, 1),p2(3, 3) 如果我们需要对pl和p2进行加法运算,该如何实 现呢?我们当然希望能使用“+〃运算符,写出表达式 “pl+p2〃,但是编译的时候却会出错,因为编译器不 知道该如何完成这个加法。这时候,我们就需要自己 编写程序来说明“+″在作用于 point类对象时,该实现 什么样的功能,这就是运算符重载。运算符重载是对 已有的运算符赋予多重含义,使同一个运算符作用于 不同类型的数据时,导致不同类型的行为
第8章 多态性 于是我们可以这样声明点类的对象: pointp1(1,1),p2(3,3) 如果我们需要对p1和p2进行加法运算,该如何实 现呢?我们当然希望能使用“+”运算符,写出表达式 “ p1+p2” ,但是编译的时候却会出错,因为编译器不 知道该如何完成这个加法。这时候,我们就需要自己 编写程序来说明“+”在作用于point类对象时,该实现 什么样的功能,这就是运算符重载。运算符重载是对 已有的运算符赋予多重含义,使同一个运算符作用于 不同类型的数据时,导致不同类型的行为
8章多态性 H 在运算符重载的实现过程中,首先把指定的运算表达 式转化为对运算符函数的调用,运算对象转化为运算 符函数的实参,然后,根据实参的类型来确定需要调 用的函数。这个过程是在编译过程中完成的
第8章 多态性 在运算符重载的实现过程中,首先把指定的运算表达 式转化为对运算符函数的调用,运算对象转化为运算 符函数的实参,然后,根据实参的类型来确定需要调 用的函数。这个过程是在编译过程中完成的