第5章 多态性与虚函数-【千锋教育】C++语言程序设计
2023-03-21
|
43页
|
114人阅读
|
0人下载
教辅
内容正文:
多态的概念
函数重载
运算符重载
第5章 多态性与虚函数
虚函数
纯虚函数与抽象类
理解多态的概念
理解纯虚函数与抽象类
掌握函数重载和运算符重载
掌握虚函数
学 习 目 标
LEARNING OBJECTIVES
初心至善 匠心育人
多态的概念
函数重载
运算符重载
虚函数
纯虚函数与抽象类
01
02
04
05
03
目 录
CATALOUGUE
初心至善 匠心育人
5.1
多态的概念
5.1.1
编译期多态与运行期多态
5.1.2
函数捆绑
初心至善 匠心育人
5.1 多态的概念
多态简单理解就是多种形态,程序中的多态是指一种行为对应着多种不同的实现,即同名函数有不同实现,因此多态是实现“一种接口,多种方法”的技术。这里的“一种接口”是指相同函数名,而“多种方法”是指多种函数实现,具体示例如下:
上述示例中,同一运算符“/”根据提供的操作数执行不同的运算,像这种在程序中同一符号或名字在不同情况下具有不同解释的现象就可以称为多态。
在面向对象程序设计中,根据程序实现多态的不同阶段,多态的实现分为编译期多态和运行期多态。
5.1.1 编译期多态与运行期多态
初心至善 匠心育人
5.1 多态的概念
1.编译期多态
编译期多态也称静态多态,它是指程序在编译阶段就可确定的多态性,主要通过重载机制实现,重载机制包括函数重载和运算符重载两大类。函数重载允许程序员用相同的标识符来定义多个功能相近的函数。运算符重载允许程序员对已有的运算符赋予多重含义,这样一个运算符作用于不同类型的数据就会导致不同的行为。
2.运行期多态
运行期多态也称动态多态,它是指程序必须在运行阶段才可确定的多态性,主要通过继承与虚函数实现。在基类与派生类中存在同名函数并且函数原型相同,这时就可以声明为虚函数,在编译时无法确定调用哪一个函数,只有程序在运行时,才能确定调用基类还是派生类中的同名函数。
5.1.1 编译期多态与运行期多态
初心至善 匠心育人
5.1 多态的概念
多态是面向对象程序设计的重要特征。它不仅增加了面向对象程序设计的灵活性,减少了冗余信息,而且显著提高了软件的可重用性和扩展性。
5.1.1 编译期多态与运行期多态
初心至善 匠心育人
5.1 多态的概念
在多态性的实现过程中,确定调用哪个同名函数的过程就是函数捆绑,也称联编。它指把一个标识符名和一个存储地址联系在一起的过程。捆绑就是计算被调用函数的入口地址,并将该地址存放到函数调用指令的地址码部分,因此多态是通过函数捆绑实现的。函数捆绑分为静态捆绑和动态捆绑,具体如下所示。
1.静态捆绑
如果编译器根据源代码调用固定的函数标识符,然后由链接器连接这些标识符,并用物理地址代替它们,这就称为静态捆绑。静态捆绑是在程序编译时进行的,运行时仅仅是传递参数、执行函数调用及清除栈等,因此执行速度快。但对编程者而言,需要在程序执行前预测所有可能出现的情况,灵活性较差。
5.1.2 函数捆绑
初心至善 匠心育人
5.1 多态的概念
2.动态捆绑
动态捆绑是指只有向具有运行期的函数传递一个实际对象时,该函数才能与多种可能的函数中的一种联系起来。具体来说,源代码本身并不总是能够说明某部分的代码是怎样执行的,源代码只指明函数调用,而不说明具体调用哪个函数,只有到程序运行时才能确定调用哪个函数。动态捆绑的缺点是执行速度慢,因为它必须由程序运行时才决定调用哪个函数,但它提供了更好的编程灵活性、问题抽象性和程序易维护性。
5.1.2 函数捆绑
初心至善 匠心育人
5.2 函数重载
在第2章中已介绍过普通函数的重载,函数重载还体现在同一个类的多个成员函数之间。例如前面学习的无参构造函数、有参构造函数就可以构成成员函数重载。
读者需要注意下面的两个函数不能形成重载,具体示例如下:
因为此处const修饰的是指针本身,只要求该指针不指向别的变量而不能要求它指向的变量是常量,所以这两个函数不能形成重载。
初心至善 匠心育人
5.3
运算符重载
5.3.1
运算符重载的概念
5.3.2
用成员函数重载运算符
5.3.3
用友元函数重载运算符
5.3.4
运算符重载距离
初心至善 匠心育人
5.3 运算符重载
运算符重载是将系统已有的运算符赋予不同的意义。运算符通常是对类中的私有成员进行操作,因此重载运算符可以采用成员函数或友元函数两种形式。
初心至善 匠心育人
5.3 运算符重载
5.3.1 运算符重载的概念
在C++语言中,运算符的默认操作对象只能是基本数据类型,具体示例如下:
在上述示例中,运算符“+”可以用来完成不同数据类型的数据加法运算,但有时对于用户自定义的数据类型也需要有类似的运算操作,如复数的加法、矩阵的加法等,这时就需要对运算符进行重新定义以赋予已有运算符新的功能,这就是运算符重载。
初心至善 匠心育人
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。