多态是指发出同样的消息被不同类型的对象接收时产生完全不同的行为,简单的说就是“一个接口,多种算法”。C++语言支持两种多态性,一种是编译时的多态,另一种是运行时的多态性。函数和运算符重载是在编译时完成,称之为静态多态,也称静态联编。运行时的多态性是通过虚函数实现,用虚函数实现的多态性称为动态多态,也称动态联编。
虚函数
虚函数的定义格式
在一个类中用关键字virtual说明在成员函数称为虚函数,其定义的格式如下:
virtual 函数类型 函数名(形参表)
{
函数体
}
定义虚函数就是为了实现多态类。在基类中某个成员函数被声明为虚函数后,这个成员函数通常要在派生类中被重新定义,否则定义虚函数就没有意义。在派生类中重新定义虚函数时,其函数原型必须与基类中的原型完全相同,否则编译时会出错或被当作函数重载处理。如果在基类中说明了虚函数,在它的派生类中与基类中虚函数说明相同的函数一定是虚函数,可以省略关键字virtual。
虚析构函数
析构函数是在该类对象消亡之前进行一些必要的清理工作,对于动态绑定的虚 函数必须用虚析构函数进行释放。
纯虚函数和抽象类
1、
纯虚函数
纯虚函数是一钟特殊的虚函数,它只有函数的声明,并没有具体实现函数的功能。它的一般格式如下:
virtual <函数返回类型><虚函数名称><参数列表>=0;
例:
#include<iostream.h>
class shape
{
public:
shape(double dfx=0.0,double dfy=0.0);
virtual void draw()=0;//纯虚函数
protected:
double firstx;
double firsty;
};
shape::shape(double dfx,double dfy)
{
firstx=dfx;
firsty=dfy;
}
//直线类
class line:public shape
{
public:
line(double dfx=0.0,double dfy=0.0,double dsx=0.0,double dsy=0.0);
void draw();
protected:
double secondx;
double secondy;
};
line::line(double dfx,double dfy,double dsx,double dsy):shape(dfx,dfy)
{
secondx=dsx;
secondy=dsy;
}
void line::draw()
{
cout<<"绘制一条直线,第一点坐标为:("
<<firstx<<","<<firsty<<"),第二点坐标为:("<<secondx<<","<<secondy<<")"<<endl;
}
class circle:public shape
{
public:
circle(double dfx=0.0,double dfy=0.0,double dr=0.0);
void draw();
protected:
double radius;
};
circle::circle(double dfx,double dfy,double dr):shape(dfx,dfy)
{
radius=dr;
}
void circle::draw()
{
cout<<"绘制一个圆,圆心坐标为:("
<<firstx<<","<<firsty<<"),圆的半径为:"
<<radius<<endl;
}
void drawing(shape *ps)
{
ps->draw();
}
void main()
{
line l(1.0,1.0,9.8,15.2);
circle c(2.0,3.0,12.4);
drawing(&l);
drawing(&c);
}
抽象类
带有纯虚函数的类也称为抽象类。在继承体系中,抽象类不能位于底层,它必须有派生类,并且其派生类中必须对抽象类中的纯虚函数有具体的实现。一般,抽象类只是撕碎一些通用的操作接口,具体的实现由其派生类完成。