图形输出(抽象类+多层继承)

题目描述

定义一个抽象类Shape,包含三个数据成员:名称、x和y坐标

包含五个虚函数分别是:名称以及x和y的get方法,求面积(返回0.0)、求体积(返回0.0)

包含一个纯虚函数shapeName,用于设置名称。

定义Point类继承Shape,在构造函数初始化x和y坐标,设置名称为"Point"

定义Circle类继承Point,新增数据r表示半径,设置名称为"Circle",其他函数根据需要自己编写

定义Cylinder类继承Circle,新增数据h表示高度,设置名称为"Cylinder",其他函数根据需要自己编写

要求上述派生类的设置名称不是在构造函数,是在…

编写一个全局函数Print,无返回值,含单个参数为Shape*类型,功能是输出图形的五个信息:名称、x和y坐标、面积、体积,要求输出必须使用抽象类的五个虚函数输出五个信息

输出格式看参考样例,面积和体积只需要输出整数部分(非四舍五入),圆周率为3.14159

要求程序中必须使用抽象类的…来创建Point、Circle、Cylinder类对象

输入

第一行输入一个点的X和Y坐标

第二行输入一个圆的X和Y坐标、半径

第三行输入一个柱体的X和Y坐标、半径、高度

输出

要求调用Print方法输出图形的信息,每个图形输出一行。

输入样例

1.1 2.2
3.3 4.4 5.5
6.6 7.7 8.8 9.9

输出样例

Point–(1.1,2.2)–0–0
Circle–(3.3,4.4)–95–0
Cylinder–(6.6,7.7)–1033–2408

代码

#include<iostream>
using namespace std;
#define PI 3.14159
class Shape{
	protected:
		string name;
		float x,y;
	public:
		Shape(float x,float y):x(x),y(y){}
		virtual string getname()=0;
		virtual	float getx(){return x;}
		virtual float gety(){return y;}
		virtual float area(){return 0.0;}
		virtual float V(){return 0.0;}
};
class Point:public Shape{
	public:
		Point(float x1,float y1):Shape(x1,y1){}		
		virtual string getname(){return name="Point";}
};
class Circle:public Point{
	private:
		float R;
	public:
	Circle(float x1,float y1,float r):Point(x1,y1),R(r){}	
	virtual float area(){
		return (PI*R*R);
	}
	virtual float getR(){return R;}	
	virtual string getname(){return name="Circle";}
};
class Cylinder:public Circle{
	private:
		float Height;
	public:
	Cylinder(float x1,float y1,float r,float h):Circle(x1,y1,r),Height(h){}	
	virtual float V(){
		return (PI*getR()*getR()*Height);
	}
	virtual float area(){
		return (PI*getR()*getR()*2+2*PI*getR()*Height);
	}		
	virtual string getname(){return name="Cylinder";}
};
void Print(Shape *p){
	cout<<p->getname()<<"--("<<p->getx()<<','<<p->gety()<<")--"<<(int)(p->area())<<"--"<<(int)(p->V()) << endl;
}
int main()
{
	float x1,y1,r,h;
	Shape* p;
	cin>>x1>>y1;
	p=new Point(x1,y1);
	Print(p);
	cin>>x1>>y1>>r;
	p=new Circle(x1,y1,r);
	Print(p);
	cin>>x1>>y1>>r>>h;
	p=new Cylinder(x1,y1,r,h);
	Print(p);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值