清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS 第8章多态性和虚函数
第8章 多态性和虚函数
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS 8.1函数重载 先解释一下多态性,一个函数名对应多种状态,即多 种实现,像这样一对多的情况称为多态性。 C++语言多态性表现在以下3个方面。 ①函数重载 ②运算符重载 ③动态联编 函数重载 相同函数对应着若干种不同实现,定义重载函数时要 求在参数的个数或类型或顺序上有所不同,以便选择。 在函数调用时根据参数的不同选择不同的实现。 参见[例8.1]
8. 1 函数重载 先解释一下多态性,一个函数名对应多种状态,即多 种实现,像这样一对多的情况称为多态性。 C++语言多态性表现在以下3个方面。 ① 函数重载 ② 运算符重载 ③ 动态联编 函数重载 相同函数对应着若干种不同实现,定义重载函数时要 求在参数的个数或类型或顺序上有所不同,以便选择。 在函数调用时根据参数的不同选择不同的实现。 参见[例8.1]
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS 8.2运算符重载 (1)什么是运算符重载 系统对已有的运算符已定义其功能,用户还可以重新定义它 的新功能,这就是运算符重载。运算符重载实际上是函数重 载,因为新功能的定义书写在函数体内。同一个运算符的不 同功能的选取由操作数的类型决定的。 (2)哪些运算符可以重载 除了下列4种运算符外,其余运算符都可以重载。不能重载的 运算符是: k
8. 2 运算符重载 (1) 什么是运算符重载 系统对已有的运算符已定义其功能,用户还可以重新定义它 的新功能,这就是运算符重载。运算符重载实际上是函数重 载,因为新功能的定义书写在函数体内。同一个运算符的不 同功能的选取由操作数的类型决定的。 (2) 哪些运算符可以重载 除了下列4种运算符外,其余运算符都可以重载。不能重载的 运算符是: * , ·* ,∷,?:
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS (3)运算符重载有4个不变 ①优先级不变 ②结合性不变 ③操作数个数不变 ④语法语义不变 (4)运算符重载遵循的原则 ①重载运算符的含义清楚,并且有实际意义 ②重载运算符不能有二义性
(3) 运算符重载有4个不变 ① 优先级不变 ② 结合性不变 ③ 操作数个数不变 ④ 语法语义不变 (4) 运算符重载遵循的原则 ① 重载运算符的含义清楚,并且有实际意义 ② 重载运算符不能有二义性
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS (5)运算符重载的两种形式 考虑到运算符重载后能够对类中的所有成员(包含私有成员) 都能进行操作,因此运算符重载的形式有两种:一是成员 函数形式,二是友元函数形式 ①重载为类的成员函数 具体格式如下: 〈类型〉 operator〈运算符〉((参数表〉) 参见[例8.2]
(5) 运算符重载的两种形式 考虑到运算符重载后能够对类中的所有成员(包含私有成员) 都能进行操作,因此运算符重载的形式有两种:一是成员 函数形式,二是友元函数形式。 ① 重载为类的成员函数 具体格式如下: 〈类型〉operator〈运算符〉(〈参数表〉) 参见[例8. 2]
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS ②重载为友元函数 具体格式如下: friend(类型〉 operator〈运算符〉(〈参数表〉) 参见[例8.3]。 比较两种形式的不同点。 (6)运算符重载举例 ①下标运算符 参见[例8.5]。 ②函数调用运算符 参见[例8.7]
② 重载为友元函数 具体格式如下: friend 〈类型〉operator〈运算符〉(〈参数表〉) 参见[例8. 3]。 比较两种形式的不同点。 (6) 运算符重载举例 ① 下标运算符 参见[例8. 5]。 ② 函数调用运算符 参见[例8. 7]
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS 8.3静态联编和动态联编 1.什么是联编 联编是将被调用的函数连接编译到调用它的程序中。 联编有两种:一种是静态联编,另一种是动态联编。 静态联编是在编译阶段进行联编的,又称早期联编。 动态联编是在运行阶段进行联编的,又称晚期联编。 通常都是静态联编,只有满足一定条件时才会实现动态联编。 2.动态联编的条件 (1)公有继承是基础 (2)虚函数是关键 (3)对象指针或引用作为引导
8. 3 静态联编和动态联编 1. 什么是联编 联编是将被调用的函数连接编译到调用它的程序中。 联编有两种:一种是静态联编,另一种是动态联编。 静态联编是在编译阶段进行联编的,又称早期联编。 动态联编是在运行阶段进行联编的,又称晚期联编。 通常都是静态联编,只有满足一定条件时才会实现动态联编。 2. 动态联编的条件 (1) 公有继承是基础 (2) 虚函数是关键 (3) 对象指针或引用作为引导
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS 8.4虚函数 虚函数是一种非静态的成员函数,说明虚函数的方法如下: virtual〈类型〉〈函数名〉(〈参数表〉) 虚函数具有如下特征: ①虚函数是在基类和派生类中说明相同而实现不同的成员函 数 ②基类中说明的虚函数具有下传给派生类的性质 ③构造函数不能说明为虚函数,而析构函数可以说明为虚函 数 参见[例8.8]、[例8.9]、[例8.10]、[例8.1]、 例8.13]
8. 4 虚函数 虚函数是一种非静态的成员函数,说明虚函数的方法如下: virtual 〈类型〉〈函数名〉(〈参数表〉) 虚函数具有如下特征: ① 虚函数是在基类和派生类中说明相同而实现不同的成员函 数 ② 基类中说明的虚函数具有下传给派生类的性质 ③ 构造函数不能说明为虚函数,而析构函数可以说明为虚函 数 参见[例8. 8]、[例8. 9]、[例8. 10]、[例8. 11]、 [例8. 13]
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS 8.5纯虚函数和抽象类 1.纯虚函数 纯虚函数是一种没有具体实现的特殊的虚函数。 纯虚函数的定义格式如下: virtual〈类型〉〈函数名〉(〈参数表〉)=0; 个基类内有一个纯虚函数时,则在它的派生类中至少有 个虚函数,否则纯虚函数是无意义的
8. 5 纯虚函数和抽象类 1. 纯虚函数 纯虚函数是一种没有具体实现的特殊的虚函数。 纯虚函数的定义格式如下: virtual 〈类型〉〈函数名〉(〈参数表〉)=0; 一个基类内有一个纯虚函数时,则在它的派生类中至少有一 个虚函数,否则纯虚函数是无意义的
清华大学出版社 000000 TSINGHUA UNIVERSITY PRESS 2.抽象类 含有纯虚函数的类称为抽象类,与此相对应的不含有纯虚函 数的类称为具体类。 抽象类的特点是不能定义对象,只可定义对象指针和对象引 用。 抽象类的主要作用是为其所组织的继承层次结构中提供一个 共的根,纯虚函数的实现由其具体的派生类来提供。 参见[例8.17]。 从例[例8.17中可以体会到面向对象程序设计的层次结构 的特点,这为程序扩展和用户编程提供方便
2. 抽象类 含有纯虚函数的类称为抽象类,与此相对应的不含有纯虚函 数的类称为具体类。 抽象类的特点是不能定义对象,只可定义对象指针和对象引 用。 抽象类的主要作用是为其所组织的继承层次结构中提供一个 公共的根,纯虚函数的实现由其具体的派生类来提供。 参见[例8. 17]。 从例[例8. 17]中可以体会到面向对象程序设计的层次结构 的特点,这为程序扩展和用户编程提供方便