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