引言:多态性概述
1.多态性
多态:操作接口根据操作环境的不同一对多
多态性:一组方法在同一操作接口为不同的对象服务
2.多态的类型
重载多态:函数重载、运算符重载
强制多态:浮点数加整数
包含多态:不同类中的同名成员函数,通过虚函数实现
参数多态:类模板实例化时操作对象的类型不同
3.多态的实现
绑定:将一个标识符名和一个存储地址联系在一起的过程
(1)编译时的多态
绑定工作在编译连接阶段完成,静态绑定
如:重载多态、强制多态、参数多态
(2)运行时的多态
绑定工作在程序运行阶段完成,动态绑定
如:包含多态(虚函数)
运算符重载
定义:对已有的运算符赋予多重含义,使同一运算符作用于不同类型的数据时产生不同的行为。
目的:使得 C++ 中的运算符也能够用来操作对象。
实质:编写以运算符作为名称的函数。
运算符重载为友元函数时,参数的个数等于运算符的目数(即操作数的个数);运算符重载为成员函数时,参数的个数等于运算符的目数减1。
例子一:时间类的改进(重载+和-)
运算符重载为成员函数
Time Time::operator+(Time& a)const
//常函数:可以使用数据成员,不能进行修改,对函数的功能有更明确的限定
{
Time m;
m.hour = hour;
m.minute = minute;
m.second = second;
m.second += a.second;
if (m.second >= 60)
{
m.second -= 60;
m.minute += 1;
}
m.minute += a.minute;
if (m.minute >= 60)
{
m.minute -= 60;
m.hour += 1;
}
m.hour += a.hour;
if (m.hour >= 24)
{
m.hour -= 24;
}
return m;
}
Time Time::operator-(Time& b)const
{
Time n;
n.hour = hour;
n.minute = minute;
n.second = second;
if ((n.hour * 3600 + n.minute * 60 + n.second) > (b.hour * 3600 + b.minute * 60 + b.second))
{
int s = ((n.hour * 3600 + n.minute * 60 + n.second) - (b.hour * 3600 + b.minute * 60 + b.second));
n.hour = s / 3600;
n.minute = (s - n.hour * 3600) / 60;
n.second = s - n.hour * 3600 - n.minute * 60;
return n;
}
else
{
int s = ((b.hour * 3600 + b.minute * 60 + b.second) - (n.hour * 3600 + n.minute * 60 + n.second));
n.hour = s / 3600;
n.minute = (s-n.hour*3600) / 60;
n.second = s - n.hour * 3600 - n.minute * 60;
return n;
}
}
运算符重载为友元函数
Time operator+(Time& a, int s)
{
Time m;
m.second = a.second + s;
if (m.second >= 60)
{
m.second -= 60;
m.minute += 1;
}
m.minute += a.minute;
if (m.minute >= 60)
{
m.minute -= 60;
m.hour += 1;
}
m.hour += a.hour;
if (m.hour >= 24)
{
m.hour -= 24;
}
return m;
}
Time operator+(int s, Time& a)
{
Time m;
m.second = a.second + s;
if (m.second >= 60)
{
m.second -= 60;
m.minute += 1;
}
m.minute += a.minute;
if (m.minute >= 60)
{
m.minute -= 60;
m.hour += 1;
}
m.hour += a.hour;
if (m.hour >= 24)
{
m.hour -= 24;
}
return m;
}
Time operator-(Time& b, int s)
{
Time n;
if (b.second >= s)
{
n.second = b.second - s;
}
else
{
n.second = b.second + 120 - s;
n.minute = n.minute + b.minute - 2;
if (n.minute < 0)
{
n.minute += 60;
n.hour--;
}
n.hour += b.hour;
if (n.hour < 0)
{
n.hour += 24;
}
}
return n;
}
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
using namespace std;
class Time {
int hour, minute, second;
public:
Time(int h, int m, int s = 0);
Time(int s = 0);
int seccalc() { return(hour * 60 + minute) * 60 + second; }
void settime(int h = 0, int m = 0, int s = 0);
void print_12();
void print_24();
//重载+,重载为成员函数
Time operator+(Time& a)const;
//重载-,重载为成员函数
Time operator-(Time& b)const;
//重载为友元函数
friend Time operator+(Time& a, int s);
friend Time operator+(int s, Time& a);
friend Time operator-(Time& b, int s);
};
Time::Time(int h, int m, int s)
{
hour = h;
minute = m;
second = s;
}
Time::Time(int s) {
hour = s / 3600;
minute = (s - hour * 3600) / 60;
second = s - hour * 3600 - minute * 60;
}
void Time::settime(int h, int m, int s)
{
hour = h;
minute = m;
second = s;
}
void Time::print_12()
{
if (hour <= 12)
{
cout << setw(2) << setfill('0') << hour << ":" << minute << ":" << second << " AM";
}
if (hour > 12)
{
cout << setw(2) << setfill('0') << hour - 12 << ":" << minute << ":" << second << " PM";
}
}
void Time::print_24()
{
cout << setw(2) << setfill('0') << hour << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second;
}
Time Time::operator+(Time& a)const
//常函数:可以使用数据成员,不能进行修改,对函数的功能有更明确的限定
{
Time m;
m.hour = hour;
m.minute = minute;
m.second = second;
m.second += a.second;
if (m.second >= 60)
{
m.second -= 60;
m.minute += 1;
}
m.minute += a.minute;
if (m.minute >= 60)
{
m.minute -= 60;
m.hour += 1;
}
m.hour += a.hour;
if (m.hour >= 24)
{
m.hour -= 24;
}
return m;
}
Time Time::operator-(Time& b)const
{
Time n;
n.hour = hour;
n.minute = minute;
n.second = second;
if ((n.hour * 3600 + n.minute * 60 + n.second) > (b.hour * 3600 + b.minute * 60 + b.second))
{
int s = ((n.hour * 3600 + n.minute * 60 + n.second) - (b.hour * 3600 + b.minute * 60 + b.second));
n.hour = s / 3600;
n.minute = (s - n.hour * 3600) / 60;
n.second = s - n.hour * 3600 - n.minute * 60;
return n;
}
else
{
int s = ((b.hour * 3600 + b.minute * 60 + b.second) - (n.hour * 3600 + n.minute * 60 + n.second));
n.hour = s / 3600;
n.minute = (s-n.hour*3600) / 60;
n.second = s - n.hour * 3600 - n.minute * 60;
return n;
}
}
Time operator+(Time& a, int s)
{
Time m;
m.second = a.second + s;
if (m.second >= 60)
{
m.second -= 60;
m.minute += 1;
}
m.minute += a.minute;
if (m.minute >= 60)
{
m.minute -= 60;
m.hour += 1;
}
m.hour += a.hour;
if (m.hour >= 24)
{
m.hour -= 24;
}
return m;
}
Time operator+(int s, Time& a)
{
Time m;
m.second = a.second + s;
if (m.second >= 60)
{
m.second -= 60;
m.minute += 1;
}
m.minute += a.minute;
if (m.minute >= 60)
{
m.minute -= 60;
m.hour += 1;
}
m.hour += a.hour;
if (m.hour >= 24)
{
m.hour -= 24;
}
return m;
}
Time operator-(Time& b, int s)
{
Time n;
if (b.second >= s)
{
n.second = b.second - s;
}
else
{
n.second = b.second + 120 - s;
n.minute = n.minute + b.minute - 2;
if (n.minute < 0)
{
n.minute += 60;
n.hour--;
}
n.hour += b.hour;
if (n.hour < 0)
{
n.hour += 24;
}
}
return n;
}
int main()
{
Time t1(2, 34), t2, t3;
t2.settime(13, 23, 34);
cout << "t1+t2:";
t3 = t1 + t2;
t3.print_24();
cout << "\nt1+65:";
t3 = t1 + 65;
t3.print_24();
cout << "\n65+t1:";
t3 = 65 + t1;
t3.print_24();
cout << "\nt2-t1:";
t3 = t2 - t1;
t3.print_24();
cout << "\nt1-70:";
t3 = t1 - 70;
t3.print_24();
return 0;
}
例子二:C++重载<<和>>(C++重载输出和输入运算符)
class student {
string ID;
string name;
char xb;
int score;
public:
student(string i = "XXX", string n = "XXX", char x = 'm', int s = 0) :ID(i), name(n), xb(x), score(s) { };
friend ostream& operator<<(ostream& os, const student& s);
friend istream& operator>>(istream& is, student& s);
};
ostream& operator<<(ostream& os, const student& s)
{
os << s.ID << " " << s.name << " " << s.xb << " " << s.score;
return os;
}
istream& operator>>(istream& is, student& s)
{
is >> s.ID >> s.name >> s.xb >> s.score;
return is;
}
int main()
{
student s;
cin >> s;
cout << s;
return 0;
}
例子三:前置和后置单目运算符重载,++
class Clock {
int hour, minute, second;
public:
Clock(int h, int m, int s) :hour(h), minute(m), second(s) { };
void showTime()
{
cout << hour << ":" << minute << ":" << second << endl;
}
Clock& operator++();//前置单目运算符重载
Clock operator++(int);//后置单目运算符重载
};
Clock& Clock::operator++()
{
second++;
if (second >= 60)
{
second -= 60;
minute++;
if (minute >= 60)
{
minute -= 60;
hour++;
if (hour >= 24)
{
hour -= 24;
}
}
}
return *this;
}
Clock Clock::operator++(int)
{
Clock old = *this;
++(*this);
return old;
}
int main()
{
Clock myClock(23, 59, 59);
cout << "First time output: ";
myClock.showTime();
cout << "Show myClock++: ";
(myClock++).showTime();
cout << "Show ++myClock: ";
(++myClock).showTime();
return 0;
}
未完待续……