写一个程序,定义抽象类型Shape,由他派生五个类:Circle(圆形),Square(正方形),Rectangle(矩形)],Trapezoid(梯形),Triange(三角形)。用虚函数分别计算几种图形的面积,并求他们的和。要求用基类指针数组,使它的每一个元素指向一个派生类的对象。
#include<iostream>
#include<cmath>
#define PI 3.14159
using namespace std;
class Shape //基类
{
public:
Shape(){}
virtual double getArea() = 0;
virtual void show() = 0;
};
class Rectangle :public Shape //矩形类
{
private:
int _l;
int _w;
public:
Rectangle(int l = 0,int w=0) :_l(l),_w(w) {
_l = l;
_w = w;
}
double getArea();
void show();
};
class Circle :public Shape //圆类
{
private:
int _r;
public:
Circle(int r = 0) :_r(r) {
_r = r;
}
double getArea();
void show();
};
class Square:public Shape //正方形类
{
private:
int _x;
int _t;
public:
Square(int x = 0) :_x(x) {
_x = x;
}
double getArea();
void show();
};
class Trapezoid :public Shape //梯形类
{
private:
int _upl;
int _downl;
int _h;
public:
Trapezoid(int upl = 0, int downl = 0,int h=0) :_upl(upl), _downl(downl) ,_h(h) {
_upl = upl;
_downl = downl;
_h = h;
}
double getArea();
void show();
};
class Triange :public Shape //三角形类
{
private:
int _x;
int _y;
int _z;
public:
Triange(int x = 0, int y = 0, int z = 0) :_x(x), _y(y), _z(z) {
_x = x;
_y = y;
_z = z;
}
double getArea();
void show();
};
double Rectangle::getArea()
{
int s;
s = _l*_w;
return s;
}
void Rectangle::show()
{
cout << "矩形面积为:" << Rectangle::getArea() << endl;
}
double Circle::getArea()
{
double s;
s = PI*_r*_r;
return s;
}
void Circle::show()
{
cout << "圆的面积为:" << Circle::getArea() << endl;
}
double Square::getArea()
{
int s;
s = _x*_x;
return s;
}
void Square::show()
{
cout << "正方形的面积:" << Square::getArea() << endl;
}
double Trapezoid::getArea()
{
double s;
s = (_upl + _downl)*_h*1 / 2;
return s;
}
void Trapezoid::show()
{
cout << "梯形的面积为:" << Trapezoid::getArea() << endl;
}
double Triange::getArea()
{
double p;
double s;
p = (1.0 / 2)*(_x + _y + _z);
s = sqrt(p*(p - _x)*(p - _y)*(p - _z));
return s;
}
void Triange::show()
{
cout << "三角形的面积为:" <<Triange::getArea()<< endl;
}
int main()
{
Rectangle a(4,5); //定义派生类对象
Circle b(2);
Square c(3);
Trapezoid d(2, 5, 4);
Triange e(3, 4, 5);
Shape *pt[5] = { &a,&b,&c,&d,&e }; //定义基类指针数组,使其每一个元素都指向一个派生类对象
double areas= 0.0;
/*Shape **p;
for (p = pt; p < pt + 5; ++p)
{
(*p)->getArea();
areas += (*p)->getArea();
}*/
for (int i = 0; i < 5; i++)
{
/*pt[i]->getArea();*/
pt[i]->show();
cout << endl;
areas = areas + pt[i]->getArea();
}
cout << "这些图形的总面积和为:" << areas << endl;
}