c多态性课件讲座.ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++为运算符重载提供了一种方法,即在进行运算符重载时,
必须写一个运算符函数,其名字为operator后随一个要重载的运
算符。例如,要重载“+”号,应该写一个名字为 operator+ 的
函数。
表5.1 运算符函数
函数
功能
operator + ( )
加法
operator - ( )
减法
operator * ( ) operator/ ( )
circle(int x,int y,int rad):point(x,y){radius=rad;}
float area(){return 3,1416*radius*radius;}//派生类中的area函数
};
3
说明:
在基类和派生类中的函数重载有两种情况: 1.参数有所差别的重载,这种重载函数的定义和调用方法在前面章
//错误
//...
} 错误原因是类complex的类型不是基本数据类型,而是用户自6定义
的数据类型。C++还是无法直接将两个complex类对象相加。
类外部的运算符函数
为了表达上的方便,人们希望预定义的内部运算符(如“+”、“-”、
“*”、“/”等)在特定类的对象上以新的含义进行解释,如希
望能够实现total=com1+com2,这就需要用重载运算符来解决。
co造u函t<数<p都.a可re以a()重<<载endl; //执行基类point中的area()的函数
c例#cicolna5ousc.utsl1<ut<<pd<coe基c.ip<n.类aoitor{i和ensatt:派r(:e)a<生ar<mee类a.n(h中)d><l<函; e数n//d执重l;行/载/执派的行生例基类子类ciprcolien中t中的的araerae(a())函的数函数
函数operator()可以
(1)外部函数 (2)类的友元函数 (3)是类的成员函数
5
5.3.1 类以外的运算符重载
对基本的数据类型,C++提供了许多预定义的运算符,如“+”、 “-”、“*”、“/”、“=” 等,若有一个复数类 complex:
class complex{
public:
double real,imag;
2
5.2 函数重载
编译时多态性可以通过函数重载来实现。函数重载的意义在于它能
Voi用d m同a一in个()名字访问一组相关的函数,也就是说,能使用户为某一
{ p类oi操nt作p(取20一,2个0);通用的名字,而由编译程序来选择具体由哪个函数
ci来rc执le行c(,8,8因,3而0)有; 助于解决程序的复杂性问题。普通成员函数和构
complex(double r=0,double i=0) {real=r;imag=i;}
}; 若要把类complex的两个对象com1和com2加在一起,下面的语句
是不能实现的:
void main()
{
complex com1(1.1,2.2), com2(3.3,4.4), total;
total=com1+com2;
circle::area()分别调用类point和类circle的area()函数。
4
5.3 运算符重载
在C++中,除了可以对函数重载外,还可以对大多数运算 符实施重载。
运算符重载通过创建运算符函数operator()来实现。 运算符函数定义了重载的运算符将要进行的新的操作, 这种操作通常作用在一个类上。
将类complex的两个对象com1和com2相加。
也可以使用以下的调用语句,将两个complex类对象相加:
total=operator+(com1,com2);
这两个调用语句是等价的,但显然后者不如前者简明和方8 便。
例 5.2 运算符函数operator+()将两个complex类对象相加程序
operator+()
complex operator+(complex om1,complex om2)
{
complex temp;
temp.real=om1.real+om2.real;
temp.imag=om1.imag+om2.imag;
r句
total=com1+com2;
第五章 多态性
1
5.1 编译时的多态性与运行时的多态性
多态性是指用同一个名字定义不同的函数,这些函数执行不同但 又类似的操作。 联编的概念: 一个源程序经过编译、连接、成为可执行文件的过程是把可执行 代码联编(或称装配)在一起的过程。 静态联编(前期联编) 静态联编要求在程序编译时就知道调用哪个函数,就决定如何 实现某一动作。 动态联编(后期联编、滞后联编) 一直要到程序运行时才能确定调用哪个函数。系统在运行时才动 态完成的联编。 静态联编支持的多态性称为编译时多态性,也称静态多态性。在 C++中,编译时多态性是通过函数重载和运算符重载实现的。 动态联编支持的多态性称为运行时多态性,也称动态多态性。在 C++中,运行 时多态性是通过继承和虚函数来实现的。
乘法 除法
operator < ( )
小于
………………
………………
7
运算符函数operator+()
在编译时遇到名为operator@的运算符函数(@表示所要重载的运
算符),就检查传递给函数的参数的类型。如果编译器在一个运
算符的两边看到自定义的数据类型,就执行用户自己的函数,而
不是常规运算符。
若要将上述类complex的两个对象相加,只要写一个运算符函数
}
int x,y;
程序运p行ub结lic果: 为:
0
point(int a,int b){x=a;y=b;}
2827.439fl9o4a1t area(){return 0.0;} //基类中的area函数
0};
class circle:public point{
int radius;
public:
节已进行了介绍;在编译时根据参数不同来区分函数重载。 2.函数所带的参数完全相同,只是它们属于不同的类。这时要人工
干预,以下两种方法可以使编译时区别这类函数: (1)使用对象名加以区分。例如:p.area()和c.erea()分别
调用类point的area()函数和类circle的area()函数。 (2)使用“类名::”加以区分。例如:point::area()和