电子科技大学:《面向对象程序设计语言C++》课程教学资源(PPT课件讲稿)第九章 多态性(主讲:丘志杰)

第九章多态性 丘志杰 电子科技大学 计算机学院软件学院
第九章 多态性 丘志杰 电子科技大学 计算机学院 软件学院

什么是多态性 多态是指同样的消息被不同类型 的对象接收时导致完全不同的行 为 多态可以分为: 编译时的多态,如函数重载、运算 符重载 运行时的多态,虚函数 2021/2/10
2021/2/10 2 什么是多态性 • 多态是指同样的消息被不同类型 的对象接收时导致完全不同的行 为。 • 多态可以分为: – 编译时的多态,如函数重载、运算 符重载 – 运行时的多态,虚函数

运算符重载 当在使用一种程序设计语言编写程序时,我们 不仅要设计新的数据类型,同时还要为新类型 设计运算。一般地,用户定义类型的运算都是 用函数的方式实现的。而在一般情况下,基本 类型的运算都是用运算符表达的,这很直观, 语义也简单。 如果直接将运算符作用在用户定义类型之上, 那么编译器将不能识别运算符的语义。因此, 在这种情况下,我们需要一种特别的机制来重 新定义作用在用户定义类型上的普通运算符的 含义。这就是运算符重载的简单概念。 2021/2/10
2021/2/10 3 运算符重载 • 当在使用一种程序设计语言编写程序时,我们 不仅要设计新的数据类型,同时还要为新类型 设计运算。一般地,用户定义类型的运算都是 用函数的方式实现的。而在一般情况下,基本 类型的运算都是用运算符表达的,这很直观, 语义也简单。 • 如果直接将运算符作用在用户定义类型之上, 那么编译器将不能识别运算符的语义。因此, 在这种情况下,我们需要一种特别的机制来重 新定义作用在用户定义类型上的普通运算符的 含义。这就是运算符重载的简单概念

在C编译器里早就存在简单的运算符重载的 概念。考虑整型和浮点型两种加法运算: int ab,c: c=a+b: mov eax, dword ptr [ 4 add eax, dword ptr [ebp-81 mov dword ptr [ebp-oChl, eax float a, b, c, c=a+b; fld dword ptr [ebp-4] fadd dword ptr [ebp-81 fstp dword ptr [ebp-och 2021/2/10
2021/2/10 4 • 在C编译器里早就存在简单的运算符重载的 概念。考虑整型和浮点型两种加法运算: int a,b,c; c=a+b; mov eax,dword ptr [ebp-4] add eax,dword ptr [ebp-8] mov dword ptr [ebp-0Ch],eax float a,b,c; c=a+b; fld dword ptr [ebp-4] fadd dword ptr [ebp-8] fstp dword ptr [ebp-0Ch]

什么是运算符重载 在原来预定义的运算符含义的基础上 再定义对于某个用户定义类型的对象 进行操作的新的含义。这就是运算符 重载。 运算符重载后,其优先级和结合性不 变,所需的操作数也不能变。 2021/2/10
2021/2/10 5 • 在原来预定义的运算符含义的基础上, 再定义对于某个用户定义类型的对象 进行操作的新的含义。这就是运算符 重载。 • 运算符重载后,其优先级和结合性不 变,所需的操作数也不能变。 什么是运算符重载

重载运算符 大多数系统预定义的运算符可以重载, 但少数的C++运算符不能重载: #、?:、,、*、 另外,不是运算符的符号,如“;”等也 不能重载。C++还不允许重载不存在的 运算符,如“$” 等 2021/2/10
2021/2/10 6 重载运算符 • 大多数系统预定义的运算符可以重载, 但少数的C++运算符不能重载: :: 、#、 ?:、 .、.* 、 * • 另外,不是运算符的符号,如“;”等也 不能重载。C++还不允许重载不存在的 运算符,如“$” 、 “**”等

例:复数的加操作 class Complex& double re. im: public: Complex(doubler=0.0, double i=0.O): re(r), im(i) Complex add(complex c)t Complex t: tre= re+cre. t im= im t cim: return t: vold main c3=c1.ad(2):这种使用方式 Complex cl(1, 2), c2(3, 4); 不太直观。 Complex c33=c1ad(c2);·我们更希望是如下方式 C=CTC 2021/2/10
2021/2/10 7 例:复数的加操作 class Complex{ double re, im; public: Complex(double r=0.0, double i=0.0): re(r), im(i){ } Complex add(Complex c){ Complex t; t.re = re + c.re; t.im = im + c.im; return t; } }; void main( ) { Complex c1(1, 2), c2(3, 4); Complex c3 = c1.add(c2); } • c3 = c1.add(c2);这种使用方式 不太直观。 • 我们更希望是如下方式: c3=c1+c2;

例:重载复数类的加运算符 class Complex public: Complex operator+(Complex c) Complex t; t re=re c re; tim=im cim return t; }; void main( Complex cl(l, 2), c2(3, 4); Complex c3=c1+c2;相当于c3=c1. operator+(c2); operator+(,称为运算符重载函数 c3=c1+c2称为 operator+(,)函数的隐式调用 8 c3=c1. operator+(c2)称为 operator+(,)函数的显示调用
2021/2/10 8 例:重载复数类的加运算符 class Complex{ …… public: Complex operator+(Complex c){ Complex t; t.re = re + c.re; t.im = im + c.im; return t; } }; void main( ) { Complex c1(1, 2), c2(3, 4); Complex c3 = c1 + c2; //相当于c3 = c1.operator+(c2); } operator+(…)称为运算符重载函数 c3 = c1 + c2称为operator+(…)函数的隐式调用 c3 = c1.operator+(c2)称为operator+(…)函数的显示调用

例:计数器重载运算符 class counter unsigned int value; public: counter ivalue=0 void operator++o void operator--O unsigned int operator(o void counter: operator++ (if (value0)value--i unsigned int counter: operator(return value 2021/2/10 9
2021/2/10 9 例:计数器重载运算符 class counter{ unsigned int value; public: counter( ){value=0;} void operator++( ); void operator--( ); unsigned int operator( )( ); }; void counter:: operator++( ){if (value0) value--;} unsigned int counter:: operator( )( ){return value;}

void main( counter my counter; for(inti=0;<10;i++){ ++my counter cout<<“ my counter=“<< my counter()<<endl; my counter cout<<“ my counter=“<< my counter()<<endl; 2021/2/10 10
2021/2/10 10 void main( ) { counter my_counter; for(int i=0;i<10;i++){ ++my_counter; cout<<“my_counter=“<<my_counter( )<<endl; } --my_counter; cout<<“my_counter=“<<my_counter( )<<endl; }
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
- 《操作系统》课程教学资源(PPT课件讲稿)Chapter 03 Process Description And Control.ppt
- 《计算机系统结构》课程教学资源(PPT课件讲稿)第五章 存储系统.ppt
- 电子科技大学:《计算系统与网络安全 Computer System and Network Security》课程教学资源(PPT课件讲稿)第2章 信息安全数学基础(计算复杂性).ppt
- 电子科技大学:《计算系统与网络安全 Computer System and Network Security》课程教学资源(PPT课件讲稿)第5章 网络隔离技术.ppt
- 电子科技大学:《计算系统与网络安全 Computer System and Network Security》课程教学资源(PPT课件讲稿)第7章 协议安全技术(安全协议实例).ppt
- 电子科技大学:《计算系统与网络安全 Computer System and Network Security》课程教学资源(PPT课件讲稿)第4章 网络基础(网络概述、协议).ppt
- 四川大学:《Matlab程序设计》课程教学资源(教学大纲)Programming in Matlab.pdf
- 四川大学:.NET and .NET Core:Languages, Cloud, Mobile and AI(PPT课件讲稿)NET for Data Science and AI.pptx
- 《数据库技术》课程教学资源(PPT课件讲稿)第3章 SQL语言基础及数据定义功能(主讲:曾晓东).ppt
- 四川大学:《Linux操作系统》课程教学资源(PPT课件讲稿)第6章 Linux系统调用.ppt
- 《编译原理 Compiler Construction》课程教学资源(PPT讲稿)语义分析 Semantic Analysis(Attributes and Attribute Grammars、Algorithms for Attribute Computation).ppt
- 《嵌入式系统开发》课程PPT教学课件(讲稿)第一章 嵌入式系统概述.ppt
- 《数据库基础》课程PPT教学课件(SQL Server)第4章 T-SQL与可编程对象.ppt
- 软件配置管理和项目管理工具(PPT讲稿)Software Configuration Management and Project Management Tool.ppt
- 《计算机系统结构》课程教学资源(PPT课件讲稿)第五章 存储层次.ppt
- 四川大学:《数据库技术》课程教学资源(PPT课件讲稿)第4章 数据库查询.ppt
- 四川大学:《操作系统 Operating System》课程教学资源(PPT课件讲稿)Chapter 7 Memory Management.ppt
- 香港浸会大学:并行输入输出(PPT讲稿)Parallel I/O.ppt
- 香港浸会大学:Kickstart Tutorial/Seminar on using the 64-nodes P4-Xeon Cluster in Science Faculty.ppt
- Essential Cluster OS Commands.ppt
- 《计算机体系结构》课程教学资源(PPT课件讲稿)第七章 多处理机系统.ppt
- 《操作系统原理》课程教学资源(PPT课件讲稿)Chapter 05 并发性——互斥和同步(Concurrency - Mutual Exclusion and Synchronization).ppt
- 《计算机系统结构》课程教学资源(PPT课件讲稿)第八章 多计算机系统.ppt
- 《计算机系统结构》课程教学资源(PPT课件讲稿)第一章 计算机系统结构的基本概念.ppt
- 《数学建模》课程教学资源(PPT讲稿)SAS基础培训(生成SAS数据集、加工SAS数据集)Statistical Analysis System.ppt
- 《数字图像处理》课程教学资源(PPT课件讲稿)第8章 彩色图像处理.ppt
- 电子工业出版社:《计算机网络》课程教学资源(第五版,PPT课件讲稿)第8章 因特网上的音频/视频服务.ppt
- 《数字图像处理》课程教学资源(PPT课件讲稿)第4章 图像增强.ppt
- 郑州大学:《计算机组成原理》课程教学资源(PPT课件讲稿,共八章,任课教师:石磊).ppt
- 长沙医学院:《计算机专业英语》课程教学资源_教学大纲.doc
- 局域网基础知识及网络设备(PPT课件讲稿).ppt
- 广西医科大学:《计算机网络 Computer Networking》课程教学资源(PPT课件讲稿)Chapter 17 NETWORK MANAGEMENT.pptx
- 《PhotoshopCS2基础教程与上机指导》课程教学资源(PPT课件讲稿)第20章 Web图像与动画设计.ppt
- 深圳大学:《图片处理基础》课程教学课件(PPT讲稿)Poisson Image Editing.pptx
- 广西外国语学院:《计算机网络》课程教学资源(PPT课件讲稿)第8章 DNS.ppt
- 《C语言程序设计》课程教学资源(PPT课件讲稿)第5章 循环结构程序设计.ppt
- 《高级语言程序设计 Advanced Programming》课程教学资源(PPT课件讲稿)第8章 指针.ppt
- 《Java面向对象程序设计》课程教学资源(PPT课件讲稿)第四章 Java图形用户界面设计 4.2 AWT和Swing组件.pptx
- 江苏海洋大学(淮海工学院):《Java面向对象程序设计》课程教学资源(PPT课件讲稿)第2章 Java语言基础.pptx
- 江苏海洋大学(淮海工学院):《Java面向对象程序设计》课程教学资源(PPT课件讲稿)第4章 Java图形用户界面设计.pptx