写一个程序,定义抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Square(正方形)、Rectangle(矩形)。利用指针、虚函数printArea()、printLength()分别输出以上三者的面积和周长,三个图形的数据在定义对象时给定。另外实现一个通用的函数计算面积和周长,而不需要考虑是何种图形。
时间: 2024-02-16 18:03:57 浏览: 71
下面是一个符合要求的C++程序:
```c++
#include <iostream>
#include <cmath>
using namespace std;
//抽象基类Shape
class Shape {
public:
virtual double getArea() = 0; //获取面积,纯虚函数
virtual double getPerimeter() = 0; //获取周长,纯虚函数
virtual void printArea() = 0; //输出面积,纯虚函数
virtual void printPerimeter() = 0; //输出周长,纯虚函数
};
//圆形类Circle,继承于Shape
class Circle : public Shape {
public:
Circle(double r) : radius(r) {}
double getArea() { return 3.1415926535 * radius * radius; } //圆形面积公式
double getPerimeter() { return 2 * 3.1415926535 * radius; } //圆形周长公式
void printArea() { cout << "圆形面积为:" << getArea() << endl; } //输出圆形面积
void printPerimeter() { cout << "圆形周长为:" << getPerimeter() << endl; } //输出圆形周长
private:
double radius; //圆形半径
};
//正方形类Square,继承于Shape
class Square : public Shape {
public:
Square(double l) : length(l) {}
double getArea() { return length * length; } //正方形面积公式
double getPerimeter() { return 4 * length; } //正方形周长公式
void printArea() { cout << "正方形面积为:" << getArea() << endl; } //输出正方形面积
void printPerimeter() { cout << "正方形周长为:" << getPerimeter() << endl; } //输出正方形周长
private:
double length; //正方形边长
};
//矩形类Rectangle,继承于Shape
class Rectangle : public Shape {
public:
Rectangle(double l, double w) : length(l), width(w) {}
double getArea() { return length * width; } //矩形面积公式
double getPerimeter() { return 2 * (length + width); } //矩形周长公式
void printArea() { cout << "矩形面积为:" << getArea() << endl; } //输出矩形面积
void printPerimeter() { cout << "矩形周长为:" << getPerimeter() << endl; } //输出矩形周长
private:
double length; //矩形长度
double width; //矩形宽度
};
//通用函数,计算任意形状的面积和周长
void calculate(Shape* shape) {
shape->printArea(); //输出面积
shape->printPerimeter(); //输出周长
}
int main() {
//定义圆形、正方形、矩形对象
Circle c(5);
Square s(4);
Rectangle r(3, 5);
//使用指针调用通用函数calculate
calculate(&c);
calculate(&s);
calculate(&r);
return 0;
}
```
上述程序定义了一个抽象基类Shape,它包含了纯虚函数getArea、getPerimeter、printArea和printPerimeter,用于获取面积、周长以及输出面积和周长。同时,它派生出三个派生类Circle、Square、Rectangle,分别代表圆形、正方形、矩形。这三个派生类重载了基类的纯虚函数,计算了它们各自的面积和周长,并输出结果。最后,我们定义了一个通用函数calculate,它的参数是Shape指针,可以计算任意形状的面积和周长。在main函数中,我们定义了三个对象c、s、r,它们分别是圆形、正方形、矩形,然后使用指针调用calculate函数,计算它们的面积和周长。
阅读全文