MST

星途 面试题库

面试题:C++类与对象设计原则之继承与多态的应用

假设有一个基类`Shape`,包含计算面积的纯虚函数`calculateArea`。现有`Circle`和`Rectangle`两个派生类继承自`Shape`。请实现这三个类,并展示如何利用多态性,通过一个`Shape`指针数组来存储不同形状对象的指针,并调用相应的`calculateArea`函数计算总面积。同时说明在这个过程中,类与对象关系是如何体现设计原则的。
21.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <vector>

// 基类Shape
class Shape {
public:
    // 纯虚函数计算面积
    virtual double calculateArea() const = 0;
    virtual ~Shape() = default;
};

// 派生类Circle
class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}
    double calculateArea() const override {
        return 3.14159 * radius * radius;
    }
};

// 派生类Rectangle
class Rectangle : public Shape {
private:
    double width;
    double height;
public:
    Rectangle(double w, double h) : width(w), height(h) {}
    double calculateArea() const override {
        return width * height;
    }
};

int main() {
    // 使用std::vector存储Shape指针
    std::vector<Shape*> shapes;

    // 创建Circle和Rectangle对象并添加到数组中
    shapes.push_back(new Circle(5));
    shapes.push_back(new Rectangle(4, 6));

    double totalArea = 0;
    // 遍历数组,调用calculateArea函数计算总面积
    for (const auto& shape : shapes) {
        totalArea += shape->calculateArea();
    }

    std::cout << "总面积: " << totalArea << std::endl;

    // 释放内存
    for (const auto& shape : shapes) {
        delete shape;
    }

    return 0;
}

设计原则体现

  1. 封装
    • CircleRectangle类将数据成员(如radiuswidthheight)封装在类内部,通过成员函数来访问和操作这些数据,保证了数据的安全性。
    • Shape类封装了公共的接口calculateArea,使得派生类遵循统一的接口规范。
  2. 继承
    • CircleRectangle类继承自Shape类,继承了Shape类的接口,同时可以根据自身的特性实现calculateArea函数,实现了代码的复用和扩展。
  3. 多态
    • 通过Shape指针数组存储不同派生类对象的指针,在运行时根据实际对象的类型调用相应的calculateArea函数,体现了多态性。这使得代码更加灵活,易于扩展新的形状类而不需要修改大量现有代码。