继承与多态2.2

/*2. 定义一个抽象类Shape,包含纯虚函数Area()(用来计算面积)和SetShape()(用来重设形状大小)。
然后派生出三角形类Triangle类、矩形Rect类、圆Circle类,分别求其面积。
最后定义一个Total_Area类,计算这几个形状的面积之和,
各形状的数据通过Total_Area类的构造函数或成员函数来设置。编写一个完整的程序。*/
#include<iostream>
#include<math.h>
using namespace std;


class Shape
{
public:
    virtual double Area() = 0;
    virtual void SetShape() = 0;
};


class Triangle:public Shape
{
private:
    double length1;
    double length2;
    double length3;
public:
    virtual double Area() ;
    virtual void SetShape() ;
    Triangle();
    ~Triangle();
};


Triangle::Triangle()
{

}


Triangle::~Triangle()
{
    cout << "Triangle Disconstruct" << endl;
}


double Triangle::Area()
{
    double temp;
    double s;

    temp = (length1 + length2 + length3)/2;
    s = sqrt(temp * (temp - length1) * (temp - length2) * (temp - length3));
    return s;
}


void Triangle::SetShape()
{
    cout << "请输入三角形的三个边长:" << endl;
    cin >> length1;
    cin >> length2;
    cin >> length3;
}


class Rect:public Shape
{
private:
    double length4;
    double width;
public:
    virtual double Area() ;
    virtual void SetShape() ;
    Rect();
    ~Rect();
};


Rect::Rect()
{

}


Rect::~Rect()
{
    cout << "Rect Disconstruct" << endl;
}


double Rect::Area()
{
    return length4 * width;
}


void Rect::SetShape()
{
    cout << "请输入矩形的长和宽:" << endl;
    cin >> length4;
    cin >> width;
}


class Circle:public Shape
{
private:
    double r;
    double PI = 3.14;
public:
    Circle();
    ~Circle();
    virtual double Area();
    virtual void SetShape();
};


Circle::Circle()
{

}


Circle::~Circle()
{
    cout << "Circle Disconstruct" << endl;
}


double Circle::Area()
{
    return r*r*PI;
}


void Circle::SetShape()
{
    cout << "请输入圆的半径:" << endl;
    cin >> r;
}


class total_area:public Triangle,public Rect,public Circle
{

public:
    total_area();
    ~total_area();
    double Total_area(Shape *a,Shape *b,Shape *c);
};


total_area::total_area()
{

}


total_area::~total_area()
{
    cout << "total_area Disconstrut" << endl;
}


double total_area::Total_area(Shape *a,Shape *b,Shape *c)
{
    double all;

    all = a->Area()+b->Area()+c->Area();
    return all;
}


int main()
{
    Triangle triangle;
    triangle.SetShape();

    Rect rect;
    rect.SetShape();

    Circle circle;
    circle.SetShape();

    total_area all;

    cout << "三角形的面积是:" << triangle.Area() << endl;
    cout << "矩形的面积是:" << rect.Area() << endl;
    cout << "圆的面积是:"  << circle.Area() << endl;
    cout << "总面积是:" <<  all.Total_area(&triangle,&rect,&circle) << endl;

}
这一题的关键就是最后的class total_area()因为这个类需要把另外三个类的面积相加的时候需要清楚说明谁是谁的Area(),上面的代码是通过指针来限定的,其实可以这样写更加容易理解;
double total_area::Total_area(Triangle triangle,Rect rect,Circle circle)
{
    double all;
    all = triangle.Area()+rect.Area()+circle.Area();
    return all;
}
输出的时候这样输出 :cout << "总面积是:" <<  all.Total_area(triangle,rect,circle) << endl;





猜你喜欢

转载自blog.csdn.net/qq_38053395/article/details/79997709