MST

星途 面试题库

面试题:C++抽象类在多态和继承体系中的复杂应用

假设有一个图形绘制的项目,包含圆形、矩形、三角形等多种图形。请基于C++抽象类设计一个继承体系,实现不同图形的绘制、计算面积和周长等功能,并且要求在代码中体现出多态的复杂应用场景,例如在一个容器中存储不同图形对象指针并进行遍历操作。
26.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

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

// 抽象图形类
class Shape {
public:
    // 纯虚函数:绘制图形
    virtual void draw() const = 0;
    // 纯虚函数:计算面积
    virtual double calculateArea() const = 0;
    // 纯虚函数:计算周长
    virtual double calculatePerimeter() const = 0;
    // 析构函数声明为虚函数,确保正确释放派生类资源
    virtual ~Shape() = default;
};

// 圆形类,继承自Shape
class Circle : public Shape {
private:
    double radius;

public:
    Circle(double r) : radius(r) {}

    void draw() const override {
        std::cout << "绘制圆形,半径为:" << radius << std::endl;
    }

    double calculateArea() const override {
        return 3.14159 * radius * radius;
    }

    double calculatePerimeter() const override {
        return 2 * 3.14159 * radius;
    }
};

// 矩形类,继承自Shape
class Rectangle : public Shape {
private:
    double width;
    double height;

public:
    Rectangle(double w, double h) : width(w), height(h) {}

    void draw() const override {
        std::cout << "绘制矩形,宽为:" << width << ",高为:" << height << std::endl;
    }

    double calculateArea() const override {
        return width * height;
    }

    double calculatePerimeter() const override {
        return 2 * (width + height);
    }
};

// 三角形类,继承自Shape
class Triangle : public Shape {
private:
    double side1;
    double side2;
    double side3;

public:
    Triangle(double s1, double s2, double s3) : side1(s1), side2(s2), side3(s3) {}

    void draw() const override {
        std::cout << "绘制三角形,边长分别为:" << side1 << "," << side2 << "," << side3 << std::endl;
    }

    double calculateArea() const override {
        double s = (side1 + side2 + side3) / 2;
        return std::sqrt(s * (s - side1) * (s - side2) * (s - side3));
    }

    double calculatePerimeter() const override {
        return side1 + side2 + side3;
    }
};

int main() {
    // 使用智能指针容器存储不同图形对象指针
    std::vector<std::unique_ptr<Shape>> shapes;

    shapes.emplace_back(std::make_unique<Circle>(5.0));
    shapes.emplace_back(std::make_unique<Rectangle>(4.0, 6.0));
    shapes.emplace_back(std::make_unique<Triangle>(3.0, 4.0, 5.0));

    // 遍历容器,调用不同图形对象的虚函数
    for (const auto& shape : shapes) {
        shape->draw();
        std::cout << "面积: " << shape->calculateArea() << std::endl;
        std::cout << "周长: " << shape->calculatePerimeter() << std::endl;
        std::cout << std::endl;
    }

    return 0;
}
  1. 抽象类 Shape
    • 定义了三个纯虚函数 drawcalculateAreacalculatePerimeter,分别用于绘制图形、计算面积和周长。
    • 析构函数声明为虚函数,以确保在通过基类指针删除派生类对象时,能正确调用派生类的析构函数。
  2. 具体图形类
    • Circle 类继承自 Shape,实现了 drawcalculateAreacalculatePerimeter 函数,用于绘制圆形并计算其面积和周长。
    • Rectangle 类继承自 Shape,实现了相应的函数,用于绘制矩形并计算其面积和周长。
    • Triangle 类继承自 Shape,实现了相应的函数,用于绘制三角形并计算其面积和周长。
  3. 多态应用
    • main 函数中,使用 std::vector<std::unique_ptr<Shape>> 容器存储不同图形对象的智能指针。
    • 通过遍历容器,调用每个对象的虚函数,实现了多态。不同类型的图形对象会根据自身的实现来执行 drawcalculateAreacalculatePerimeter 函数。