#include <iostream>
#include <vector>
#include <memory>
#include <numbers>
class Shape {
public:
virtual double area() const = 0;
virtual ~Shape() = default;
};
class Circle : public Shape {
public:
explicit Circle(double radius) : radius_(radius) {}
double area() const override {
return std::numbers::pi * radius_ * radius_;
}
private:
double radius_;
};
class Rectangle : public Shape {
public:
Rectangle(double width, double height) : width_(width), height_(height) {}
double area() const override {
return width_ * height_;
}
private:
double width_, height_;
};
class Triangle : public Shape {
public:
Triangle(double base, double height) : base_(base), height_(height) {}
double area() const override {
return 0.5 * base_ * height_;
}
private:
double base_, height_;
};
double CalculateTotalArea(const std::vector<std::unique_ptr<Shape>>& shapes) {
double total = 0.0;
for (const auto& shape : shapes) {
total += shape->area();
}
return total;
}
int main() {
std::vector<std::unique_ptr<Shape>> shapes;
shapes.push_back(std::make_unique<Circle>(5.0));
shapes.push_back(std::make_unique<Rectangle>(4.0, 6.0));
shapes.push_back(std::make_unique<Triangle>(3.0, 4.0));
std::cout << "Areas of individual shapes:\n";
for (const auto& shape : shapes) {
std::cout << shape->area() << '\n';
}
double total = CalculateTotalArea(shapes);
std::cout << "Total area: " << total << std::endl;
return 0;
}