编写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle、Square、Rectangle、Trapezoid、Triangle。用虚函数分别计算几种图形面积,并求它们之和
时间: 2023-07-10 22:32:23 浏览: 134
好的,这是一个面向对象编程的问题,需要使用 C++ 语言来实现。以下是代码实现:
```c++
#include <iostream>
using namespace std;
// Shape 抽象基类
class Shape {
public:
virtual double getArea() const = 0; // 纯虚函数,用于计算面积
};
// Circle 类
class Circle : public Shape {
private:
double radius; // 半径
public:
Circle(double r) : radius(r) {}
virtual double getArea() const { return 3.14159 * radius * radius; } // 计算圆面积
};
// Square 类
class Square : public Shape {
private:
double side; // 边长
public:
Square(double s) : side(s) {}
virtual double getArea() const { return side * side; } // 计算正方形面积
};
// Rectangle 类
class Rectangle : public Shape {
private:
double length, width; // 长、宽
public:
Rectangle(double l, double w) : length(l), width(w) {}
virtual double getArea() const { return length * width; } // 计算矩形面积
};
// Trapezoid 类
class Trapezoid : public Shape {
private:
double upper, lower, height; // 上底、下底、高
public:
Trapezoid(double u, double l, double h) : upper(u), lower(l), height(h) {}
virtual double getArea() const { return (upper + lower) * height / 2; } // 计算梯形面积
};
// Triangle 类
class Triangle : public Shape {
private:
double base, height; // 底、高
public:
Triangle(double b, double h) : base(b), height(h) {}
virtual double getArea() const { return base * height / 2; } // 计算三角形面积
};
int main() {
Shape* shapes[5]; // 定义 5 个指向 Shape 类对象的指针数组
shapes[0] = new Circle(2.0);
shapes[1] = new Square(3.0);
shapes[2] = new Rectangle(2.0, 3.0);
shapes[3] = new Trapezoid(2.0, 4.0, 3.0);
shapes[4] = new Triangle(2.0, 3.0);
double totalArea = 0.0;
for (int i = 0; i < 5; i++) {
totalArea += shapes[i]->getArea(); // 调用虚函数计算各个图形的面积并求和
}
cout << "Total area: " << totalArea << endl;
return 0;
}
```
代码解释:
1. 定义了抽象基类 Shape,其中包含一个纯虚函数 getArea(),用于计算面积。
2. 定义了 5 个派生类 Circle、Square、Rectangle、Trapezoid、Triangle,它们分别继承自 Shape 类,并实现了各自的计算面积方法。
3. 在主函数中,定义了一个指向 Shape 类对象的指针数组,用于存储各种图形的实例。
4. 循环遍历指针数组,调用虚函数 getArea() 计算各个图形的面积,并累加到总面积 totalArea 中。
5. 最后输出总面积 totalArea。
注意:这里使用了动态内存分配,需要在程序结束时手动释放内存,即使用 delete 关键字释放指针数组中的各个对象。
阅读全文