写一个程序,定义抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Square(正方形)、Rectangle(矩形)。利用指针、虚函数printArea()、printLength()分别输出以上三者的面积和周长,三个图形的数据在定义对象时给定。另外实现一个通用的函数计算面积和周长,而不需要考虑是何种图形。
时间: 2024-02-16 15:03:57 浏览: 48
好的,以下是代码实现:
```cpp
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
class Shape {
public:
virtual double getArea() = 0;
virtual double getPerimeter() = 0;
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) {
radius = r;
}
double getArea() {
return M_PI * radius * radius;
}
double getPerimeter() {
return 2 * M_PI * radius;
}
};
class Square : public Shape {
private:
double sideLength;
public:
Square(double s) {
sideLength = s;
}
double getArea() {
return sideLength * sideLength;
}
double getPerimeter() {
return 4 * sideLength;
}
};
class Rectangle : public Shape {
private:
double length, width;
public:
Rectangle(double l, double w) {
length = l;
width = w;
}
double getArea() {
return length * width;
}
double getPerimeter() {
return 2 * (length + width);
}
};
void printArea(Shape* s) {
cout << "面积为:" << s->getArea() << endl;
}
void printPerimeter(Shape* s) {
cout << "周长为:" << s->getPerimeter() << endl;
}
int main() {
Circle c(5);
Square s(6);
Rectangle r(4, 8);
printArea(&c);
printPerimeter(&c);
printArea(&s);
printPerimeter(&s);
printArea(&r);
printPerimeter(&r);
vector<Shape*> shapeList;
shapeList.push_back(&c);
shapeList.push_back(&s);
shapeList.push_back(&r);
double totalArea = 0;
double totalPerimeter = 0;
for (auto shape : shapeList) {
totalArea += shape->getArea();
totalPerimeter += shape->getPerimeter();
}
cout << "总面积为:" << totalArea << endl;
cout << "总周长为:" << totalPerimeter << endl;
return 0;
}
```
解释一下上面的代码:
- 实现了一个抽象基类 Shape,其中包含了两个纯虚函数 getArea() 和 getPerimeter(),用于获取面积和周长。
- Circle、Square、Rectangle 分别继承了 Shape 类,并重写了 getArea() 和 getPerimeter() 方法,用于计算各自的面积和周长。
- printArea() 和 printPerimeter() 分别用于输出一个 Shape 指针所指向的图形的面积和周长。
- 在 main() 函数中,我们创建了一个 Circle、一个 Square 和一个 Rectangle 对象,并分别调用了 printArea() 和 printPerimeter() 方法输出它们的面积和周长。
- 我们还定义了一个 vector<Shape*> 类型的容器 shapeList,并将三个图形的指针加入到其中,然后使用 for 循环遍历容器,分别调用各个图形的 getArea() 和 getPerimeter() 方法,计算出它们的总面积和总周长。最后输出它们的值。
阅读全文