图形类(继承与派生、纯虚函数、动态联编的多态性)

#include<iostream>
#include<iomanip>
using namespace std;
#define PI 3.14159265

///抽象类Shape
class Shape
{
public:
	virtual void ShowData() = 0;
	virtual void GoArea() = 0;
	virtual void GoVolume() = 0;
private:
};

///公有派生类--平面图形类
class Plane_Figure:virtual public Shape
{
public:
	void ShowData() { cout << fixed << setprecision(2) << area << endl; }
	void GoArea() { area = 0; }
	void GoVolume() { volume = 0; }

	double area;
	double volume;
};

///公有派生类--立体图形类
class Solid_Figure:virtual public Shape
{
public:
	void ShowData() { cout << fixed << setprecision(2) << volume << endl; }
	void GoArea() { area = 0; }
	void GoVolume() { volume = 0; }

	double area;
	double volume;
};

///圆形类
class Circle :public Plane_Figure
{
public:
	void ShowData() { cout << fixed << setprecision(2) << area << endl; }
	void GoArea()
	{
		cin >> r;
		area = PI*r*r;
	}
private:
	int r;
};

///椭圆类
class Ellipse :public Plane_Figure
{
public:
	void ShowData() { cout << fixed << setprecision(2) << area << endl; }
	void GoArea()
	{
		cin >> a >> b;
		area = PI*a*b;
	}
private:
	int a;
	int b;
};

///矩形类
class Rectangle :public Plane_Figure
{
public:
	void ShowData() { cout << fixed << setprecision(2) << area << endl; }
	void GoArea()
	{
		cin >> l >> w;
		area = l*w;
	}
private:
	int l;
	int w;
};

///等腰三角形类
class Tag :public Plane_Figure
{
public:
	void ShowData() { cout << fixed << setprecision(2) << area << endl; }
	void GoArea()
	{
		cin >> b >> h;
		area = (b*h) / 2;
	}
private:
	int b;
	int h;
};


///球类
class Ball :public Solid_Figure
{
public:
	void ShowData() { cout << fixed << setprecision(2) << volume << endl; }
	void GoVolume()
	{
		cin >> R;
		volume = (4 * PI*R*R*R) / 3;
	}
private:
	int R;
};

///圆柱体类
class Column :public Solid_Figure
{
public:
	void ShowData() { cout << fixed << setprecision(2) << volume << endl; }
	void GoVolume()
	{
		cin >> R >> H;
		volume = PI*R*R + 2*PI*R*H;
	}
private:
	int R;
	int H;
};

///长方体类
class Cuboid :public Solid_Figure
{
public:
	void ShowData() { cout << fixed << setprecision(2) << volume << endl; }
	void GoVolume()
	{
		cin >> L >> W >> H;
		volume = L*W*H;
	}
private:
	int L;
	int W;
	int H;
};

int main()
{
	Shape *p;
	Circle cc;		//圆形
	Ellipse e;		//椭圆
	Rectangle r;	//矩形	
	Tag t;			//三角形
	Ball b;			//球
	Column cl;		//圆柱体
	Cuboid cb;		//长方体
	int n;
	cin >> n;
	//要求(6):测试数据时...
	switch (n)
	{
	case 1://圆形
		p = &cc;
		p->GoArea();
		p->ShowData(); break;
	case 2://椭圆
		p = &e;
		p->GoArea();
		p->ShowData(); break;
	case 3://矩形
		p = &r;
		p->GoArea();
		p->ShowData(); break;
	case 4://三角形
		p = &t;
		p->GoArea();
		p->ShowData(); break;
	case 5://球
		p = &b;
		p->GoVolume();
		p->ShowData(); break;
	case 6://圆柱体
		p = &cl;
		p->GoVolume();
		p->ShowData(); break;
	case 7://长方体
		p = &cb;
		p->GoVolume();
		p->ShowData(); break;
	default:
		break;
	}
	return 0;
}

【问题描述】 

(1)首先设计一个抽象类Shape,包含三个公有的纯虚函数,分别实现显示数据成员的值、计算面积、计算体积的功能,函数名为ShowData()、GoArea()、GoVolume()

(2)设计两个Shape的公有派生类平面图形类、立体图形类,包含公有的数据成员面积area和体积volume,并实现基类Shape的三个纯虚函数的函数体。

(3)分别设计圆形类、椭圆类、矩形类、等腰三角形类,作为平面图形类的公有派生类。并在各个类里依次添加数据成员圆形半径、椭圆的横轴和纵轴长度、矩形的长和宽、等腰三角形的底边长和高。并实现数据的显示输出函数、实现计算面积的函数。

(4)分别设计球类、圆柱体类、长方体类,作为立体图形类的公有派生类。并在各个类里依次添加数据成员球的半径,圆柱体的底面的半径和高,长方体的长宽高。并实现数据的显示输出函数、实现计算体积的函数。

(5)计算面积的函数和计算体积的函数均需要先cin相应的数据,再才能计算,计算结果为double型,且保留2位小数,将计算结果给相应的数据成员进行赋值。函数无返回值。

(6)测试数据时,定义各种类型的对象,然后定义Shape类型的指针p,用户依次输入1、2、3......6、7,分别代表圆形、椭圆、矩形、三角形、球、圆柱体、长方体。通过使用switch语句,将对象地址赋值给p指针。然后调用该对象的计算面积或计算体积的函数,输出计算结果。为方便测试,switch仅执行一次,程序则结束。

举例:

Shape *p;  

Circle c;  

p=&c;

p->GoArea();

p->ShowData();

【样例输入】

5

2

【样例输出】

33.51

【样例说明】5代表球,2代表球的半径,根据体积公式4/3*pi*r*r*r得到33.51

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值