重载与多态
多态
多态指的是同样的消息被不同类型的对象接受时导致不同的行为。
多态分为静态多态和动态多态;静态多态的实现方法是函数的重载,动态多态实现的方法是利用对象覆盖类的函数功能。
多态的实现角度:编译时的多态和运行时的多态;
绑定:绑定是指计算机程序自身彼此相关联的过程,就是把一条消息和一个对象结合的过程,绑定工作在编译前完成称为静态绑定,绑定工作在程序运行阶段完成的情况称为动态绑定。
重载
运算符重载
运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为。
运算符重载语法:
返回类型 operator 运算符(形参表)
{
函数体
}
运算符重载为成员函数:
#include
using namespace std;
class Clock{
public:
Clock(int hour = 0, int minute = 0, int second = 0);
void showTime()const;
Clock& operator++();
Clock operator++(int);
private:
int hour, minute, second;
};
Clock::Clock(int hour, int minute, int second){
if (0 <= hour&&hour < 24 && 0 <= minute&&minute < 60 && 0 <= second&&second < 60){
this->hour = hour;
this->minute = minute;
this->second = second;
}
else
cout << "Time error!" << endl;
}
void Clock::showTime()const{
cout << hour << ":" << minute << ":" << second << endl;
}
Clock&Clock::operator++(){
second++;
if (second >= 60){
second -= 60;
minute++;
if (minute >= 60){
minute -= 60;
hour = (hour + 1) % 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;
}
运算符重载为非成员函数:
运算符重载为非成员函数时运算所需要的操作数都需要通过函数的形参表来传递。形参表中从左到右的顺序就是运算符操作数的顺序。
虚函数
虚函数是动态绑定的基础。虚函数必须是非静态的成员函数。虚函数经过派生之后在类族中就可以运行实现动态多态。
一般虚函数成员:
虚函数声明只能出现在类定义中的函数原型声明中,而不能出现在成员函数实现的时候。由成员函数来调用或通过指针引用来访问虚函数。
虚函数声明语法:
virtual 函数类型 函数名(形参表);
虚析构函数:
如果一个类的析构函数是虚函数,那么由它派生出的所有子类的析构函数也是虚函数,析构函数设置为虚函数之后,在使用指针引用时可以动态绑定,实现运行时的多态保证使用基类型的指针就能够调用适当的析构函数针对不同对象进行清理工作。
声明语法:
virtual ~类名();
使用举例:
#include
using namespace std;
class Base
{
public:
~Base();
};
Base::~Base()
{
cout<<"Base destructor"<
纯虚函数与抽象类
纯虚函数:是一个在基类中声明的虚函数
声明格式:
virtual 函数类型 函数名(参数表)=0;
声明为纯虚函数后基类就可以不再给出函数的实现部分。
抽象类:
带有纯虚函数的类似抽象类。抽象类的主要作用是通过它为一个类族建立一个公共接口使它们能够有效的发挥多态特性。