c++多态分为静态多态和动态多态。资料上显示静态多态通过模块和函数重载来实现的,动态多态是通过继承、虚函数、指针来实现的。
1.首先我们看一看函数重载,它旨在用同名函数来完成相同的基本操作,即使这种操作被用于不同的数据类型。运算符重载是将重载的概念扩展到运算符上。当运算符重载为类的成员函数时,函数的参数个数比原来的少一,因为第一个参数默认为this指针隐式传递。
Time operator+(Time &t);
等价于*this+t;
2.在提出友元函数前,我们会发现有时候第一个参数是非类对象时,重载为成员函数的重载并不适用了。重载友元函数没有隐退的参数this,,操作数都由参数来传递了,这样函数的参数就等同于运算符参数格数了。但是注意有一些并不能重载为友元函数:=,(),->.
第一步:将其原型放在类声明中,并且不要忘记关键字friend.
friend Time operator*(double m,const Time &t);
注意:它不是成员函数,但它与成员函数有相同的访问权限。比如可以访问类对象的私有部分。
第二步:函数定义的编写,因为它不是成员函数,所以不要用class::限定符。也不要在定义中使用关键字friend。
举例常见的友元:重载<<运算符
使用输出操作时,我们知道第一个操作是cout,ostream的一个对象。接下来才是类成员。那么我们必须使用友元函数。
void operator<<(ostream &os,const Time &t)
{
os<<t.hours<<t.minutes<<endl;
}
则在main()函数中使用 cout<<t;
但是问题又出现了,如果我要在主函数中输出:cout<<t1<<t2;
那么会出错,因为t2对应的<<左操作符不是ostream的对象了。所以怎么将<<t2
左边也是ostream的一个对象呢。因此,将operator<<()函数实现为返回一个指向ostream对象的引用。这样(cout<<t1)
运行后就表示ostream对象cout。
其中cout<<t1
调用友元函数就是opreator(cout的引用,t1),返回cout的引用(即别名).
所以就形成了我们经常使用的友元函数申明:
friend ostream & operator<<(ostream &os,const Time &t);