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

下载本文档

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

文档简介

第五章 多态性和虚函数5.1 多态性(polymorphism)的定义(一)定义:多态性 - 能够呈现不同形态的特性或状态。polymorphism - the quality or state of being able to assume different forms。 (摘自 Webster 词典)(二)两种多态性1编译时的多态性:亦称静态联编(束定)(static binding)或早期联编(early binding)。即本章中前半部分将要讲述的函数和运算符函数 的重载功能。编译系统进行编译时在函数调用指令表中找到多个重载的函数中相对应的那个函数(即形参的数量和类型完全匹配的那个函数) ,将它们与主程序中调用它们的代码联编(binding) ,以供主程序运行时正确地调用。在 C中这表现为“行为共享”(例如同名函数实现不同功能) ,或称“同一接口,多种方法”。2所谓运行时的多态性:亦称所谓动态联编(束定)(dynamic binding)或滞后联编(late binding) 。编译系统进行编译时,根据程序代码内容、根据虚函数地址表中 this 指针所指向的地址、找到相应的虚函数,将它与主程序中调用它的代码联编(binding),以供主程序在运行中调用它(本章后半部分将详细讲解,它实质上仍然是静态联编) 。5.2 函数重载(overloading)5.2.1 普通函数的重载C 语言中一个函数只能处理一个类型的数据,或者只能处理整型数据,或者只能处理浮点型数据。不可能兼顾两种或多种数据类型。能否使用同一名称的函数来处理多个类型的数据?这可以在面向对象程序设计语言中解决。在C中可用一个名称的函数例如 sq( )来处理所有参数类型的平方,例子如下。例 1平方函数的重载:两个单形参的重载函数/ overld_fun1.cpp/overloading of functions#include double sq(double y)return y*y;int sq(int y)return y*y;void main()int i=5;double d=5.5;std:cout#include int max(int x, int y)return xy? x: y;double max(double x, double y)return xy? x: y;char* max(char* x, char* y)return strcmp(x, y)0? x: y;void main()std:coutint fun(int y)return y;void fun(int y)+y;/ error: void fun(int) : overloaded function differs/ only by return type from int fun(int)/ error: fun : redefinition; different basic typesvoid main()int i=5;std:cout#include /包含 atoi(p)的函数原型class timerint seconds;public:timer( ); /零形参构造函数timer(int); /单个形参构造函数timer(int, int); /双形参构造函数timer(char *); /字符形参构造函数int gettime( );timer:timer( ) /零形参构造函数 seconds = 0; timer:timer(int t) /单个形参构造函数 seconds = t; timer:timer(int min, int sec) /双形参构造函数 seconds = min * 60 + sec; timer:timer(char *p) /字符形参构造函数 seconds = atoi(p); int timer:gettime( ) return seconds; void main()timer t1, t2(56), t3(1, 18), t4(“123“);std:coutclass Aint a, b;public:A( );A(int i, int j);A( );void Set(int i, int j)a=i; b=j;A:A( )a=b=0;std:coutclass A int X, Y;public:A ( ) X = 0; Y = 0;std:coutclass pointint x, y;public:point (int vx=0, int vy=0) x = vx; y = vy; friend point operator + (point friend point operator - (point void print() std:coutclass complex double real, imag; /复数的实数和虚数部分public:complex ( double r, double i) real = r; imag = i; complex ( ) real = 0; imag = 0; void print( );friend complex operator + (complex /plusfriend complex operator - (complex /minus;void complex:print( )std:cout0) std:coutclass pointint x, y;public:point() x = 0; y = 0; point (int vx, int vy) x = vx; y = vy; point operator + (point point operator - (point void print() std:coutx + p.x;temp.y = y + p.y;return temp;point point:operator -(point temp.x = x - p.x;temp.y = y - p.y;return temp;void main()point p1(10,10), p2(20,20), p3;p3.print();p3 = p1 + p2; /即 p3 = p1.operator + (p2);p3.print();p3 = p3 - p1; /即 p3 = p3.operator - (p1);p3.print();/* Results:0 030 3020 20*/此处“operator ”已是成员函数,p 是它的实参,也是此运算符的操作数。但表现形式和普通函数不同。实际上“p1+p2 运算”是如下的函数调用:p1.operator +(p2)位于重载运算符函数左面的是调用该运算符的对象,而运算符右面的对象是该运算符的实参。因此,作为类的成员函数的运算符的形参数目比它的操作数少一个。再重复以前提到的:根据什么来区别预定义的加法运算符和重载的加法运算符呢?唯一的根据是操作数的类型。预定义的加法运算符的操作数是预定义的数据类型,而重载的加法运算符的操作数则是类的对象。5.3.1.3 处理字符串的运算符重载字符串的运算有其特殊性,须要特殊处理。现看两个情况:求字符或字符串最大值;将两个字符串衔接起来。(一)求两个字符或两个字符串的最大值:C 语言中已有库函数 int strcmp (char* str1,char* str2); 用于将两个字符串 str2 与 str2 进行比较,并将比较结果写入整型返回值中。例 1求两个字符或两个字符串的最大值/ overld_str_10.cpp/ see the difference between overloaded functions used for/ determining the max value of two chars or two char strings#include #include char max(char ch1, char ch2)return ch1ch2?ch1:ch2;char* max(char* str1, char* str2)int flag = strcmp(str1, str2);return flag=0 ? str1 : str2; /根据返回值来确定最大值void main()char str1 = “OK“;char str2 = “Right“;char data1 = C;char data2 = S;std:cout#include class strc

温馨提示

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

评论

0/150

提交评论