分别定义抽象类Shape,由它派生出5个派生类Circle(圆形)、Square(正方形)、Rectangle(矩形)、Trapezoid(梯形)、Triangle(三角形)。
① 要求使用基类指针数组,使它的每一个元素指向一个派生类对象。
② 用虚函数分别计算这些图形的周长和面积,并分别求出它们的和。
③ 实现指定的功能,按要求撰写实验报告。
代码仅供参考
#include <iostream>
#include <string>
using namespace std;
const double PI=3.14;
class Shape
{
public:
virtual float perimeter() const {return 0.0;}//周长
virtual float area() const {return 0.0;}//面积
virtual void shapeName() const = 0;//虚函数
};
class Circle:public Shape
{
public:
Circle(float r=0);
virtual float perimeter() const;
virtual float area() const;
virtual void shapeName() const {cout << "圆:";}
protected:
float radius;
};
//声明Circle类成员函数
Circle::Circle(float r):radius(r){}
float Circle::perimeter() const {return PI*radius*2;}
float Circle::area() const {return PI*radius*radius;}
class Square:public Shape
{
public:
Square(float a=0);
virtual float perimeter() const;
virtual float area() const;
virtual void shapeName() const {cout << "正方形:";}
protected:
float sideLength;
};
//声明Square类成员函数
Square::Square(float a):sideLength(a){}
float Square::perimeter() const {return 4*sideLength;}
float Square::area() const {return sideLength*sideLength;}
class Rectangle:public Shape
{
public:
Rectangle(float a=0, float b=0);
virtual float perimeter() const;
virtual float area() const;
virtual void shapeName() const {cout << "矩形:";}
protected:
float sideLength1;
float sideLength2;
};
//声明Rectangle类成员函数
Rectangle::Rectangle(float a, float b):sideLength1(a),sideLength2(b){}
float Rectangle::perimeter() const {return 2*sideLength1+2*sideLength2;}
float Rectangle::area() const {return sideLength1*sideLength2;}
class Trapezoid:public Shape
{
public:
Trapezoid(float a=0, float b=0,float c=0,float d=0,float e=0);
virtual float perimeter() const;
virtual float area() const;
virtual void shapeName() const {cout << "梯形:";}
protected:
float upper_bottom;
float under_bottom;
float height;
float length1;
float length2;
};
//声明Trapezoid类成员函数
Trapezoid::Trapezoid(float a, float b, float c, float d, float e):
upper_bottom(a),under_bottom(b),height(c),length1(d),length2(e){}
float Trapezoid::perimeter() const {return length1+length2+upper_bottom+under_bottom;}
float Trapezoid::area() const {return (upper_bottom+under_bottom)*height/2;}
class Triangle:public Shape
{
public:
Triangle(float a=0, float b=0, float c=0, float d=0);
virtual float perimeter() const;
virtual float area() const;
virtual void shapeName() const {cout << "三角形:";}
protected:
float bottom;
float height;
float sideLength1;
float sideLength2;
};
//声明Triangle类成员函数
Triangle::Triangle(float a, float b, float c, float d):
bottom(a),height(b),sideLength1(c),sideLength2(d){}
float Triangle::perimeter() const {return bottom*height/2;}
float Triangle::area() const {return sideLength1+sideLength2+bottom;}
int main()
{
Circle circle(3);
Square square(4);
Rectangle rectangle(3,4);
Trapezoid trapezoid(2,10,3,5,5);
Triangle triangle(6,4,5,5);
Shape *pt[5]={&circle,&square,&rectangle,&trapezoid,&triangle};
int i,j;
for(i=0;i<5;i++)
{
pt[i]->shapeName();
cout<<"perimeter="<<pt[i]->perimeter()<<",area="<<pt[i]->area()<<endl;
}
float sum1=0,sum2=0;
for(i=0;i<5;i++)
{
sum1+=pt[i]->perimeter();
sum2+=pt[i]->area();
}
cout << "总周长为:" << sum1 << endl;
cout << "总面积为:" << sum2 << endl;
return 0;
}