C++多态性的理解和举例

来源:互联网 发布:肝功能包括乙肝吗 知乎 编辑:程序博客网 时间:2024/06/05 06:18


多态性是面向对象程序的一个重要特征,下面通过程序来理解程序的多态性:

//多态性#include<iostream>using namespace std;class Point{public:Point(float x=0,float y=0);void setPoint(float,float);float getX() const {return x;}float getY() const {return y;}friend ostream &operator<<(ostream &,const Point &);protected:float x,y;  //必须定义成protected,子类的对象才能访问,加入定义成private,则后面子类无法调用};Point::Point(float a,float b){x=a;y=b;}void Point::setPoint(float a,float b){x=a;y=b;}ostream & operator<<(ostream &output,const Point &p)//第一次重载<<{output<<"["<<p.x<<","<<p.y<<"]"<<endl;return output;}class Circle:public 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 &);protected: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.14*radius*radius;}ostream & operator<<(ostream &output,const Circle &c){output<<"Center=["<<c.x<<","<<c.y<<"],r="<<c.radius<<",area="<<c.area()<<endl;return output;}class Cylinder:public Circle{public:Cylinder(float x=0,float y=0,float r=0,float h=0);void setHeight(float);float getHeight() const;float area() const;   //与Circle类中的area同名,同名覆盖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 2*Circle::area()+2*3.14*radius*height;}float Cylinder::volume() const{return Circle::area()*height;}ostream & operator<<(ostream& output,const Cylinder &cy){output<<"Center=["<<cy.getX()<<","<<cy.getY()<<"],r="<<cy.radius<<",height="<<cy.getHeight()<<"\narea="<<cy.area()<<",volume="<<cy.volume()<<endl;return output;}int main(){//测试PointPoint point(1.2,1.2);cout<<"x="<<point.getX()<<",y="<<point.getY()<<endl;cout<<point<<endl;point.setPoint(1.5,1.5);cout<<"X="<<point.getX()<<"Y="<<point.getY()<<endl;cout<<point<<endl;//测试CircleCircle point1(2.0,2.0,1.0);Point &pRef=point1;//Point 对象 被 Circle 对象 point1初始化,只初始化(x,y)cout<<"original circle:\nx="<<point1.getX()<<",y="<<point1.getY()<<",r="<<point1.getRadius()<<",area="<<point1.area()<<endl;cout<<"circle(重载<<):"<<point1;cout<<"Point pRef:"<<pRef<<endl;//输出点的信息,不输出圆的信息point1.setRadius(2.0);cout<<"original circle:\nx="<<point1.getX()<<",y="<<point1.getY()<<",r="<<point1.getRadius()<<",area="<<point1.area()<<endl;cout<<"circle(重载<<):"<<point1;cout<<endl;point1.setRadius(4.0);point1.setPoint(3.1,3.1);cout<<"original circle:\nx="<<point1.getX()<<",y="<<point1.getY()<<",r="<<point1.getRadius()<<",area="<<point1.area()<<endl;cout<<"circle(重载<<):"<<point1;cout<<endl;//测试CylinderCylinder point2(4.0,4.0,3.0,5.0);cout<<"Cylinder:"<<point2;point2.setPoint(1.0,1.0);point2.setRadius(1.0);point2.setHeight(1.0);cout<<"Cylinder:"<<point2;system("pause");return 0;}

0 0