版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/navicheung/article/details/82830882
C++程序设计(第三版) 谭浩强 习题12.5 个人设计
习题 12.5 写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle、Square、Rectangle、Tarpezoid、Triangle。用虚函数分别计算几种图形面积,并求它们的和。要求用基类指针数组,使它的每一个元素指向一个派生类对象。
代码块:
#include <iostream>
#include <iomanip>
using namespace std;
class Shape
{
public:
Shape(){}
virtual ~Shape(){}
virtual double Area() const{return 0;}
virtual void shapeName() const =0;
};
class Circle: public Shape
{
public:
Circle(double r){radius=r;}
~Circle(){}
virtual double Area() const {return 3.14159*radius*radius;}
virtual void shapeName() const {cout<<"Circle ";}
protected:
double radius;
};
class Square: public Shape
{
public:
Square(double a){x=a;}
~Square(){}
virtual double Area() const {return x*x;}
virtual void shapeName() const {cout<<"Square ";}
protected:
double x;
};
class Rectangle: public Shape
{
public:
Rectangle(double a, double b){x=a; y=b;}
~Rectangle(){}
virtual double Area() const {return x*y;}
virtual void shapeName() const {cout<<"Rectangle ";}
protected:
double x, y;
};
class Trapezoid: public Shape
{
public:
Trapezoid(double a, double b, double c){x=a; y=b; z=c;}
~Trapezoid(){}
virtual double Area() const{return ((x+y)*z)/2;}
virtual void shapeName() const {cout<<"Trapezoid ";}
protected:
double x, y, z;
};
class Triangle: public Shape
{
public:
Triangle(double a, double h){x=a; y=h;}
~Triangle(){}
virtual double Area() const {return (x*y)/2;}
virtual void shapeName() const {cout<<"Triangle ";}
protected:
double x, y;
};
int main()
{
Circle circle(5);
Square square(4);
Rectangle rectangle(3, 4);
Trapezoid trapezoid(2.0, 3.0, 4.0);
Triangle triangle(4, 3);
double sum=0;
Shape *pt[5]={&circle, &square, &rectangle, &trapezoid, &triangle};
Shape **p;
for (p=pt; p<pt+5; p++){
(*p)->shapeName();
cout<<"area="<<(*p)->Area()<<endl;
sum+=(*p)->Area();
}
cout<<"Area sum="<<sum<<endl;
system("pause");
return 0;
}