#include <iostream>
#include <memory>
#include <vector>
using std::cout;
using std::endl;
class Shape {
public:
virtual ~Shape() {}
virtual double Area() const = 0;
};
class Circle : public Shape {
public:
explicit Circle(double r) : r_(r) {}
double Area() const override { return 3.14159 * r_ * r_; }
void Roll() const { cout << " (a circle can roll)" << endl; }
private:
double r_;
};
class Square : public Shape {
public:
explicit Square(double s) : s_(s) {}
double Area() const override { return s_ * s_; }
private:
double s_;
};
int main(int argc, char** argv) {
double d = 3.9;
int n = static_cast<int>(d);
cout << "static_cast<int>(3.9) = " << n << endl;
std::vector<std::unique_ptr<Shape>> shapes;
shapes.push_back(std::make_unique<Circle>(2.0));
shapes.push_back(std::make_unique<Square>(3.0));
for (const auto& shape : shapes) {
cout << "Area = " << shape->Area();
Circle* c = dynamic_cast<Circle*>(shape.get());
if (c != nullptr) {
cout << " -> it is a Circle:" << endl;
c->Roll();
} else {
cout << " -> not a Circle" << endl;
}
}
return EXIT_SUCCESS;
}