多态性:指同样的消息被不同类型的对象接收时有可能产生完全不同的行为(与之前类型兼容相反)
多态性主要有三种表现形式:
1、函数重载
2、运算符重载
3、虚函数
数目运算符重载实例:(不可以重载的运算符:* :: ?: sizeof)
原则:1、不能改变原运算符的优先级和结合性
2、不能改变操作数的个数
3、经重载的运算符,其操作数中至少应该有一个是自定义类型。
实现的形式有两种:友元函数或者类成员函数
1、如果要重载 B 为类成员函数,使之能够实现表达式 oprd1 B oprd2,其中 oprd1 为A 类对象,则 B 应被重载为 A 类的成员函数,形参类型应该是 oprd2 所属的类型。
经重载后,表达式 oprd1 B oprd2 相当于 oprd1.operator B(oprd2)。
2、重载为类成员函数时 参数个数=原操作数个数-1 (后置++、--除外)
3、 重载为友元函数时 参数个数=原操作数个数,且至少应该有一个自定义类型的形参。
4、如果需要重载一个运算符,使之能够用于操作某类对象的私有成员,可以将此运算符重载为该类的非成员(通常为友元)函数。
5、函数的形参代表依自左至右次序排列的各操作数。
6、后置单目运算符 ++和--的重载函数,形参列表中要增加一个int,但不必写形参名。
1 #include<iostream> 2 using namespace std; 3 class Complex 4 { 5 private: 6 double real; 7 double imag; 8 public: 9 Complex(double a,double b):real(a),imag(b) 10 {} 11 Complex() 12 {} 13 Complex operator +(Complex c1);重载为类成员函数 14 Complex operator -(Complex c2); 15 void display(); 16 17 }; 18 void Complex::display() 19 { 20 cout<<"("<<real<<","<<imag<<")"<<endl; 21 22 } 23 Complex Complex::operator + (Complex c1) 24 { 25 Complex tmp; 26 tmp.real = real + c1.real; 27 tmp.imag = imag + c1.imag; 28 return tmp; 29 } 30 Complex Complex::operator - (Complex c2) 31 { 32 Complex tmp; 33 tmp.real = real - c2.real; 34 tmp.imag = imag - c2.imag; 35 return tmp; 36 } 37 38 int main() 39 { 40 Complex a(2.3,1.4); 41 Complex b(1.5,1.7); 42 Complex c = a+b; 43 Complex d = a-b; 44 c.display(); 45 d.display(); 46 }
结果:
(3.8,3.1)
(0.8,-0.3)
单目运算符重载实例:
1 #include<iostream> 2 using namespace std; 3 class Clock 4 { 5 private: 6 int hour; 7 int minute; 8 int second; 9 public: 10 Clock(int newh,int newm,int news):hour(newh),minute(newm),second(news) 11 { 12 } 13 Clock &operator ++(); 14 Clock operator ++(int); 15 void showtime() 16 { 17 cout<<hour<<":"<<minute<<":"<<second<<endl; 18 } 19 }; 20 Clock &Clock::operator++() 21 { 22 second++; 23 if(second == 60) 24 { 25 second =0; 26 minute++; 27 } 28 if(minute ==60) 29 { 30 minute = 0; 31 hour++; 32 } 33 if(hour==24) 34 hour =0; 35 return *this; 36 } 37 Clock Clock::operator++(int) 38 { 39 Clock old = *this; 40 ++*this; 41 return old; 42 } 43 int main() 44 { 45 Clock c1(23,59,59); 46 c1.showtime(); 47 ++c1; 48 c1.showtime(); 49 (c1++).showtime(); 50 c1.showtime(); 51 }
结果:
23:59:59
0:0:0
0:0:0
0:0:1
友元运算符重载范例
#include<iostream> using namespace std; class complex //复数类声明 { 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(); //显示复数的值 private: //私有数据成员 double real; double imag; }; void complex::display() { cout<<"("<<real<<","<<imag<<")"<<endl; } 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); } int main() { complex a(2.3,1.4); complex b(1.5,1.7); complex c = a+b; complex d = a-b; c.display(); d.display(); }