· 多态性指发出同样的消息被不同类型的对象接收时导致完全不同的行为。
· 多态的实现:
①函数重载、②运算符重载-->静态(编译时的多态)
虚函数-->动态:运行时的多态
运算符重载
· 运算符重载是对已有的运算符赋予多重含义
· 规则限制:①可以重载除 . .* :: ?: 外的所有运算符。②不改变原运算符的优先级和结合性
③不改变操作数个数
· 两种形式:①重载为类成员函数。②重载为友元函数。
举例:
#include<iostream.h>
class complex //复数类声明
{
public: //外部接口
complex(double r=0.0,double i=0.0){real=r;imag=i;}//构造函数
complex operator + (complex c2);//+重载为成员函数
complex operator - (complex c2);//-重载为成员函数
void display(); //输出复数
private:
double real; //实部
double imag; //虚部
};
complex complex::operator+(complex c0)//重载函数实现
{
complex c;
c.real=c0.real+real;
c.imag=c0.imag+imag;
return complex(c.real,c.imag);
}
complex complex::operator-(complex c0)//重载函数实现
{
complex c;
c.real=real-c0.real;
c.imag=imag-c0.imag;
return complex(c.real,c.imag);
}
void complex::display()
{
cout<<"("<<real<<","<<imag<<")"<<endl;
}
void main()
{
complex c1(5,4),c2(2,10),c3;
cout<<"c1=";c1.display();
cout<<"c2=";c2.display();
c3=c1-c2; //使用重载运算符完成复数减法
cout<<"c3=c1-c2=";
c3.display();
c3=c1+c2; //使用重载运算符完成复数加法
cout<<"c3=c1+c2=";
c3.display();
}
前置单目运算符
如++a,重载后,a.operator++().
后置单目运算符
如a++,重载后,a.operator++(0)
举例:重载运算符走秒
#include<iostream.h>
class Clock //时钟类
{
int Hour,Minute,Second;
public:
Clock(int NewH,int NewM,int NewS);//构造函数
void ShowTime(); //时间显示
void operator++();//前置单目运算符重载
void operator++(int);//后置单目运算符重载
};
Clock::Clock(int NewH=0,int NewM=0,int NewS=0)
{
Hour=NewH;
Minute=NewM;
Second=NewS;
}
void Clock::operator++()//前置重载
{
Second++;
if(Second>=60)
{
Second=Second-60;
Minute++;
if(Minute>=60)
{
Minute=Minute-60;
Hour++;
Hour=Hour%24;
}
}
cout<<"++Clock:";
}
void Clock::operator++(int)//后置重载
{
Second++;
if(Second>=60)
{
Second=Second-60;
Minute++;
if(Minute>=60)
{
Minute=Minute-60;
Hour++;
Hour=Hour%24;
}
}
cout<<"Clock++:";
}
void Clock::ShowTime()
{
cout<<"Now time is:"<<Hour<<":"<<Minute<<":"<<Second<<endl;
}
void main()
{
Clock myClock(23,59,59);
cout<<"First time output:"<<endl;
myClock.ShowTime();
myClock++;
myClock.ShowTime();
++myClock;
myClock.ShowTime();
}
运算符友元函数设计
· 双目运算符B重载后,,表达式oprd1 B oprd2等同于operator B(oprd1,oprd2)
· 前置单目运算符B重载后,表达式 B oprd 等同于 operator B(oprd)
· 后置单目运算符B重载后,表达式 B oprd 等同于 operator B(oprd,0)
例:友元函数操作符重载实现复数运算。
#include<iostream.h>
class complex //复数类声明
{
double real;
double imag;
public:
complex(double r=0.0,double i=0.0)//构造函数
{real=r;imag=i;}
friend complex operator+(complex c1,complex c2);//友元函数,运算符+重载
friend complex operator-(complex c1,complex c2);//友元函数,运算符-重载
void display(); //显示复数值
}
complex operator+(complex c1,complex c2)
{return complex(c2.real+c1.real,c2.imag+c1.imag)}
complex operator-(complex c1,complex c2)
{return complex(c1.real+c2.real,c1.imag+c2.imag)}
……
虚函数
参见C++继承与派生