利用虚函数求面积

利用虚函数求面积

题目

定义抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Rectangle( 长方形)、和Triangle (三角形),用虚函数分别计算面积。编写求面积和函数double TotalArea (const vector &),该函数利用基类指针向量,它的每一个元素指向一个派生类的图形对象。编写测试解释器,读入各种图形信息,动态生成各种图形对象,由vector管理。利用求面积虚函数,输出面积总和,要求正确释放空间。PI取3.1416。

输入描述

circle 后跟半径 rectangle后跟长和宽 triangle后跟三条边

输出描述

结果保留小数点后4位

样例输入

circle 5.2 circle 6.0
rectangle 3.4 2
triangle 3 4 5
rectangle 4.4 10
样例输出

254.8465

代码

#include
#include
#include
#include
#include 
#define PI 3.1416
using namespace std;
class Shape
{
public:
	virtual ~Shape() { }
	virtual double GetArea() const = 0;
};
class Circle: public Shape
{
private:
	double radius;
public:
	Circle(double r): radius(r) {}
	double GetArea() const { return PI * radius * radius; }
};
class Rectangle: public Shape
{
private:
	double height;
	double width;
public:
	Rectangle(double h, double w): height(h), width(w) { }
	double GetArea() const { return height * width; }
};
class Trangle:public Shape
{
	private:
		double e1, e2, e3;
	public:
		Trangle(double a, double b, double c):e1(a), e2(b), e3(c) {}
		double GetArea() const
		{
			double p=(e1+e2+e3)/2;
			return sqrt(p*(p-e1)*(p-e2)*(p-e3));
		}
};
double TotalArea (vector jojo)//这里也可以传递引用,当时看题目没看到传递引用所以直接传值了
{
	double sum=0;
	for(int i=0;iGetArea();
		delete jojo[i];//在这里释放内存是不合适的,但就这个题目而言这样是没错的,可以另外写一个循环释放内存
		sum+=Area;
	}
	return sum;
}
int main(void)
{
	Shape *p;
	vector jojo;
	char s[10];
	double r;
	double c, k;
	double e1, e2, e3;
	int num=1;
	while(cin>>s)
	{
		//cin>>s;
		if(!strcmp(s, "circle"))
		{
			cin>>r;
			p=new Circle(r);
			jojo.push_back(p);
		}
		else if(!strcmp(s, "rectangle"))
		{
			cin>>c>>k;
			p=new Rectangle(c, k);
			jojo.push_back(p);
			//delete p;
		}
		else if(!strcmp(s, "triangle"))
		{
			cin>>e1>>e2>>e3;
			p=new Trangle(e1, e2, e3);
			jojo.push_back(p);
			//delete p;
		}
	}
	printf("%.4f", TotalArea(jojo));
	jojo.clear();
}

你可能感兴趣的:(利用虚函数求面积)