编写一个程序,定义抽象基类shape,由它派生出5个派生类: circle(圆形)、square(正方形)、rectangle(矩形)、trapezoid (梯形)、triangle (三角形)。用虚函数计算几种图形面积,并求它们之和。要求用基类指针数组,使它每一个元素指向上述定义一个派生类对象。
时间: 2023-05-31 17:19:49 浏览: 380
### 回答1:
好的,以下是程序的中文回复:
首先,我们需要定义一个抽象基类shape,其中包含一个纯虚函数getArea(),用于计算图形面积。然后,我们派生出5个派生类:circle、square、rectangle、trapezoid和triangle,分别实现getArea()函数。最后,我们定义一个基类指针数组,使每个元素指向一个派生类对象,并计算它们的面积之和。
下面是程序的示例代码:
### 回答2:
首先,我们需要定义一个抽象基类shape,它包含一个纯虚函数calcArea(),用于计算该图形的面积。
接着,我们派生5个图形类,分别是circle、square、rectangle、trapezoid和triangle,每个派生类都需要实现calcArea()函数。
然后,我们创建一个基类指针数组,即shape* shapes[5],把它的每个元素分别指向一个派生类对象,以便通过这个指针数组调用各个图形的calcArea()函数。
最后,我们遍历这个指针数组,计算每个图形的面积,再加起来就是所有图形面积的总和。
下面是示例代码:
```c++
#include <iostream>
using namespace std;
class shape {
public:
virtual double calcArea() = 0; // 纯虚函数,用于计算面积
};
class circle : public shape {
public:
double radius;
double calcArea() override { // 实现calcArea()函数,计算圆形面积
return 3.14159 * radius * radius;
}
};
class square : public shape {
public:
double side;
double calcArea() override { // 实现calcArea()函数,计算正方形面积
return side * side;
}
};
class rectangle : public shape {
public:
double length;
double width;
double calcArea() override { // 实现calcArea()函数,计算矩形面积
return length * width;
}
};
class trapezoid : public shape {
public:
double top;
double bottom;
double height;
double calcArea() override { // 实现calcArea()函数,计算梯形面积
return (top + bottom) * height / 2;
}
};
class triangle : public shape {
public:
double base;
double height;
double calcArea() override { // 实现calcArea()函数,计算三角形面积
return base * height / 2;
}
};
int main() {
shape* shapes[5]; // 基类指针数组
double sum = 0.0; // 所有图形面积的总和
circle c;
c.radius = 2.0;
shapes[0] = &c;
square s;
s.side = 3.0;
shapes[1] = &s;
rectangle r;
r.length = 2.0;
r.width = 3.0;
shapes[2] = &r;
trapezoid t;
t.top = 2.0;
t.bottom = 4.0;
t.height = 3.0;
shapes[3] = &t;
triangle g;
g.base = 2.0;
g.height = 3.0;
shapes[4] = &g;
for (int i = 0; i < 5; i++) {
sum += shapes[i]->calcArea(); // 计算每个图形的面积,并加到总和里
}
cout << "所有图形的面积总和是:" << sum << endl;
return 0;
}
```
输出结果为:
```
所有图形的面积总和是:23.8496
```
总的来说,这个程序实现了抽象基类和虚函数的概念,使用了多态和基类指针数组,让代码具有了更好的可扩展性和可维护性。
### 回答3:
这道题目要求我们编写一个程序,定义一个抽象基类shape,并由它派生出5个派生类circle(圆形)、square(正方形)、rectangle(矩形)、trapezoid (梯形)、triangle (三角形),用虚函数计算每种图形的面积,并求它们之和。
首先,我们需要定义抽象基类shape。抽象基类为了实现虚函数,需要包含一个至少一个纯虚函数,以及一个虚析构函数,用于解决通过基类指针删除派生类对象的问题。代码如下:
```
class shape {
public:
virtual ~shape() {}
virtual double area() const = 0;
};
```
接下来,我们需要分别定义5个派生类,它们继承自shape类,实现自己的面积计算方法。代码如下:
```
class circle : public shape {
public:
circle(double r) : radius(r) {}
virtual double area() const { return 3.14 * radius * radius; }
private:
double radius;
};
class square : public shape {
public:
square(double l) : length(l) {}
virtual double area() const { return length * length; }
private:
double length;
};
class rectangle : public shape {
public:
rectangle(double l, double w) : length(l), width(w) {}
virtual double area() const { return length * width; }
private:
double length;
double width;
};
class trapezoid : public shape {
public:
trapezoid(double a, double b, double h) : top(a), bottom(b), height(h) {}
virtual double area() const { return (top + bottom) * height / 2; }
private:
double top;
double bottom;
double height;
};
class triangle : public shape {
public:
triangle(double b, double h) : base(b), height(h) {}
virtual double area() const { return base * height / 2; }
private:
double base;
double height;
};
```
最后,我们需要在主函数中创建一个基类指针数组和五个派生类对象,通过循环和基类指针调用计算面积方法,最后将它们加起来求和。代码如下:
```
int main() {
shape* shapes[5] = {
new circle(3),
new square(4),
new rectangle(5, 6),
new trapezoid(2, 5, 3),
new triangle(4, 6)
};
double total_area = 0;
for (int i = 0; i < 5; i++) {
total_area += shapes[i]->area();
delete shapes[i];
}
cout << "total area: " << total_area << endl;
return 0;
}
```
以上就是本题的解答。总体来说,这道题目考查了我们对于面向对象编程以及多态性的掌握程度,同时也锻炼了我们的编程能力。
阅读全文