定义抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Square(正方形)、Rectangle(矩形)。利用指针、虚函数printArea()、printLength()分别输出以上三者的面积和周长,三个图形的数据在定义对象时给定。另外实现一个通用的函数计算面积和周长,而不需要考虑是何种图形。
时间: 2024-02-16 13:05:07 浏览: 69
好的,这是一个面向对象的编程问题,我来给你讲解一下。
首先,我们需要定义一个抽象基类Shape,它包含两个纯虚函数printArea()和printLength(),分别用于输出面积和周长。这个类不能被实例化,只能被继承。代码如下:
```c++
class Shape {
public:
virtual void printArea() = 0;
virtual void printLength() = 0;
};
```
接下来,我们需要定义三个派生类Circle、Square和Rectangle,它们分别表示圆形、正方形和矩形。这些类需要实现Shape类中的两个纯虚函数,并且在构造函数中初始化它们的数据。代码如下:
```c++
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
void printArea() override { std::cout << "Circle's area: " << 3.14159265358979323846 * radius * radius << std::endl; }
void printLength() override { std::cout << "Circle's length: " << 2 * 3.14159265358979323846 * radius << std::endl; }
};
class Square : public Shape {
private:
double side;
public:
Square(double s) : side(s) {}
void printArea() override { std::cout << "Square's area: " << side * side << std::endl; }
void printLength() override { std::cout << "Square's length: " << 4 * side << std::endl; }
};
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
void printArea() override { std::cout << "Rectangle's area: " << width * height << std::endl; }
void printLength() override { std::cout << "Rectangle's length: " << 2 * (width + height) << std::endl; }
};
```
最后,我们需要实现一个通用的函数来计算面积和周长,这个函数接收一个Shape类型的指针作为参数,利用多态性质,可以根据实际传入的对象来调用printArea()和printLength()函数。代码如下:
```c++
void calculate(Shape* shape) {
shape->printArea();
shape->printLength();
}
```
使用时,我们可以先创建三个图形对象,并分别调用calculate()函数来计算它们的面积和周长。代码如下:
```c++
int main() {
Circle c(5.0);
Square s(4.0);
Rectangle r(3.0, 5.0);
calculate(&c);
calculate(&s);
calculate(&r);
return 0;
}
```
输出结果如下:
```
Circle's area: 78.5398
Circle's length: 31.4159
Square's area: 16
Square's length: 16
Rectangle's area: 15
Rectangle's length: 16
```
这就是一个完整的面向对象的例子,希望你能理解并掌握它!
阅读全文