**
- 多态性是指具有不同功能的函数可以用同一个函数名。
- 在面向对象方法中, 向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。
- 在C++程序设计中,在不同的类中定义了其响应消息的方法。
- 多态性分为两类
- 静态多态性
- 动态多态性
- 函数重载和运算符重载属于静态多态性,在程序编译时系统就能决定调用的是哪个函数,因此静态多态性又称编译时的多态性。
- 静态多态性是通过函数的重载实现的(运算符重载实质上也是函数重载)。
- 动态多态性是在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。
- 动态多态性是通过虚函数(virtual function)实现的。
- 例:先建立一个Point(点)类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高)。要求编写程序,重载运算符“<<”和“>>”,使之能用于输出以上类对象。
```cpp
include
class Point {public: Point(float x=0,float y=0);//有默认参数的构造函数 void setPoint(float,float); //设置坐标值 float getX( ) const {return x;} //读x坐标 float getY( ) const {return y;} //读y坐标 friend ostream & operator<<(ostream &,const Point &);//重载运算符“<<” protected: //受保护成员 float x,y; };//下面定义Point类的成员函数//声明类Point
//Point的构造函数 Point::Point(float a,float b) //对x,y初始化 {x=a;y=b;} //设置x和y的坐标值 void Point::setPoint(float a,float b) //为x,y赋新值 {x=a;y=b;} //重载运算符“<<”,使之能输出点的坐标 ostream & operator<<(ostream &output,const Point &p) {output<<″[″<<p.x<<″,″<<p.y<<″]″<<endl; return output; } class Circle:public Point//circle是Point类的公用派生类 {public: Circle(float x=0,float y=0,float r=0); //构造函数 void setRadius(float); //设置半径值 float getRadius( ) const; //读取半径值 float area ( ) const; //计算圆面积 friend ostream &operator<<(ostream &,const Circle &);//重载运算符“<<” private: float radius; }; //定义构造函数,对圆心坐标和半径初始化 Circle::Circle(float a,float b,float r):Point(a,b),radius(r){ } //设置半径值 void Circle::setRadius(float r) {radius=r;} //读取半径值 float Circle::getRadius( ) const {return radius;} //计算圆面积 float Circle::area( ) const {return 3.14159radiusradius;} //重载运算符”<<”,使之按规定的形式输出圆的信息 ostream &operator<<(ostream &output,const Circle &c) {output<<”Center=[“<<c.x<<”,”<<c.y<<”],r=”<<c.radius<<”<<c.area()<<endl; return output; } class Cylinder:public Circle// Cylinder是Circle的公用派生类 {public: Cylinder (float x=0,float y=0,float r=0,float h=0);//构造函数 void setHeight(float); //设置圆柱高 float getHeight( ) const; //读取圆柱高 float area( ) const; //计算圆表面积 float volume( ) const; //计算圆柱体积 friend ostream& operator<<(ostream&,const Cylinder&);//重载运算符“<<” protected: float height; //圆柱高 }; //定义构造函数 Cylinder::Cylinder(float a,float b,float r,float h) :Circle(a,b,r),height(h){} //设置圆柱高 void Cylinder::setHeight(float h){height=h;} //读取圆柱高 float Cylinder::getHeight( ) const {return height;} //计算圆柱表面积 float Cylinder::area()const {return 2Circle::area()+23.14159radiusheight;} //计算圆柱体积 float Cylinder::volume()const {return Circle::area() *height;} //重载运算符“<<”,使之按规定的形式输出圆的信息 ostream &operator<< (ostream &output,const Cylinder &cy) {output<<”Center=[“<<cy.x<<”,”<<cy.y”],r=”<<cy.radius<<”,h=”<<cy.height <<”\narea=”<<cy.area()<<”,volume=”<<cy,volume()<<endl; return output; } int main() {Cylinder(3.5,6.4,5.2,10);//定义Cylinder类对象cy1 cout<<””\noriginal cylinder:\nx=”<<cy1.getX()<<”,y=”<<cy.getY()<<”,r=”<<cy1.getRadius()<<”,h=”<<cy1.getHeight()<<”\narea=”<<cy1.area()<<”,volume=”<<cy1.volume()<<endl;//用系统定义的运算符“<<”输出cy1的数据 cy1.setHeight(15); //设置圆柱高 cy1.setRadius(7.5); //设置圆半径 cy1.setPoint(5,5); //设置圆心坐标值x,y cout<<”\nnew cylinder:\n”<<cy1; //用重载运算符”<<”输出cy1的数据 Point &pRef=cy1; //pRef是Point类对象的引用变量 cout<<”\npRef as a Point:”<<pRef; //pRef作为一个“点”输出 Circle &cRef = cy1; //pRef是Circle类对象的引用变量 cout<<”\ncRef as a Circle:”<<cRef; //cRef作为一个”圆”输出 } ```