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


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

//多态性
#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()
{
	//测试Point
	Point 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;

	//测试Circle
	Circle 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;

	//测试Cylinder
	Cylinder 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值