Bootstrap

C++:虚函数与多态性习题2

题目内容:

编写程序,声明抽象基类Shape,由它派生出3个派生类:Circle、Rectangle、Triangle,用虚函数分别计算图形面积,并求它们的和。要求用基类指针数组,使它每一个元素指向一个派生类对象。

输出样例如下如图:

代码如下:

#include <iostream>
#include <cmath>
using namespace std;

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

class Circle : public Shape
{
private:
    double radius;
public:
    Circle(double r) : radius(r) {}
    virtual double Area()
    {
        return 3.14 * radius * radius;
    }
};

class Rectangle : public Shape
{
private:
    double width, height;
public:
    Rectangle(double w, double h) : width(w), height(h) {}
    virtual double Area()
    {
        return width * height;
    }
};

class Triangle : public Shape
{
private:
    double base, height;
public:
    Triangle(double b, double h) : base(b), height(h) {}
    virtual double Area()
    {
        return 0.5 * base * height;
    }
};

int main()
{
    Shape* shapes[3];
    shapes[0] = new Circle(5.0);
    shapes[1] = new Rectangle(4.0, 6.0);
    shapes[2] = new Triangle(3.0, 4.0);

    double totalArea = 0.0;
    for (int i = 0; i < 3; ++i)
    {
        totalArea += shapes[i]->Area();
        cout << "Shape " << i + 1 << "面积为: " << shapes[i]->Area() << endl;
    }
    cout << "总面积为: " << totalArea << endl;
    return 0;
}

这段 C++ 代码实现了一个简单的面向对象程序,用于计算不同形状(圆形、矩形、三角形)的面积以及它们的总面积。下面将对代码进行详细解释:
1. 抽象基类Shape类的定义

  • virtual double Area() = 0;:这是一个纯虚函数,意味着Shape类是一个抽象基类,不能实例化对象。所有继承自Shape的派生类都必须实现这个Area函数,用于计算各自形状的面积。
  • virtual ~Shape() {}:虚析构函数,确保在通过基类指针删除派生类对象时,能够正确调用派生类的析构函数,避免内存泄漏。

2. 派生类Circle的定义

  • class Circle : public ShapeCircle类继承自Shape类,使用public继承方式,意味着Shape类的公有成员在Circle类中仍然是公有的。
  • double radius;:私有成员变量,用于存储圆的半径。
  • Circle(double r) : radius(r) {}:构造函数,用于初始化圆的半径。
  • virtual double Area():重写基类的纯虚函数Area,实现计算圆面积的功能,圆的面积公式为,这里取 3.14。

3. 派生类Recently的定义

  • class Rectangle : public ShapeRectangle类继承自Shape类。
  • double width, height;:私有成员变量,分别存储矩形的宽度和高度。
  • Rectangle(double w, double h) : width(w), height(h) {}:构造函数,用于初始化矩形的宽度和高度。
  • virtual double Area():重写基类的纯虚函数Area,实现计算矩形面积的功能。

4. 派生类Triangle的定义

  • class Triangle : public ShapeTriangle类继承自Shape类。
  • double base, height;:私有成员变量,分别存储三角形的底和高。
  • Triangle(double b, double h) : base(b), height(h) {}:构造函数,用于初始化三角形的底和高。
  • virtual double Area():重写基类的纯虚函数Area,实现计算三角形面积的功能。

5. 主函数

  • Shape* shapes[3];:定义一个基类指针数组,用于存储不同形状对象的指针。
  • shapes[0] = new Circle(5.0);shapes[1] = new Rectangle(4.0, 6.0);shapes[2] = new Triangle(3.0, 4.0);:使用new运算符动态创建CircleRectangleTriangle对象,并将它们的指针存储在shapes数组中。
  • double totalArea = 0.0;:用于存储所有形状的总面积。
  • for (int i = 0; i < 3; ++i):遍历shapes数组,调用每个形状对象的Area函数计算面积,并累加到totalArea中,同时输出每个形状的面积。
  • cout << "总面积为: " << totalArea << endl;:输出所有形状的总面积。

觉得有帮助就给博主点个关注叭~~

有问题的可以私信或者在评论区一起交流

友友们一起加油叭QAQ

;