写一个程序,定义抽象类型Shape,由他派生五个类:Circle(圆形),Square(正方形),Rectangle(矩形),Trapezoid(梯形),Triange(三角形)。用虚函数分别计算几种图形的面积,并求他们的和。要求用基类指针数组,使它的每一个元素指向一个派生类的对象。
/*
圆面积S=3.14*r*r
矩形面积S=长*宽
三角形面积S=(底*高)/2
正方形面积S=a*a
梯形面积S=((上底+下底)*高)/2
*/
#include<iostream>
using namespace std;
#define PI 3.14159
class Shape//抽象基类
{
public:
virtual float area()const = 0;
virtual void display()const = 0;
};
class Circle :public Shape// 圆面积
{
public:
Circle(double a) :r(a) {}
virtual float area()const
{
return PI*r*r;
}
virtual void display()const
{
cout << "圆面积" << area() << endl;
}
private:
double r;
};
class Rectangle :public Shape//矩形面积
{
public:
Rectangle(double a, double b) :l(a), w(b) {}
virtual float area()const
{
return l*w;
}
virtual void display()const
{
cout << "矩形面积" << area() << endl;
}
private:
double l;
double w;
};
class Triangle :public Shape//三角形面积
{
public:
Triangle(double a, double b) :d(a), h(b) {}
virtual float area()const
{
return (d*h) / 2;
}
virtual void display()const
{
cout << "三角形面积" << area() << endl;
}
private:
double d;
double h;
};
class Square :public Shape//正方形面积
{
public:
Square(double a) :a1(a) {}
virtual float area()const
{
return a1*a1;
}
virtual void display()const
{
cout << "正方形面积" << area() << endl;
}
private:
double a1;
};
class Trapezoid :public Shape//梯形面积
{
public:
Trapezoid(double sd, double xd, double h) :shad(sd), xiad(xd), hight(h) {}
virtual float area()const
{
return ((shad + xiad)*hight) / 2;
}
virtual void display()const
{
cout << "梯形面积" << area() << endl;
}
private:
double shad;
double xiad;
double hight;
};
int main()
{
Circle c1(4); //圆
Rectangle r1(3, 6); //矩形
Triangle t1(2.5, 5); //三角形
Square s1(3.4); //正方形
Trapezoid tr1(3.2, 4.5, 7);//梯形
Shape *p[5] = { &c1,&r1,&t1,&s1,&tr1 };
int i;
double m = 0.0;
for (i = 0; i<5; i++)
{
p[i]->display();
m = m + p[i]->area();
}
cout << "总面积:" << m << endl;
}