Все фигуры в векторе считают площадь как базовый класс
struct Shape {
virtual ~Shape() = default;
virtual double area() const { return 0; }
};
struct Circle : Shape {
explicit Circle(double r) : r(r) {}
double area() const override { return 3.14159 * r * r; }
double r;
};
std::vector<Shape> shapes;
shapes.push_back(Circle(2.0));
std::cout << shapes[0].area(); // 0
Почему вызывается Shape::area, хотя метод виртуальный?
- В вектор скопирована только часть Shape — срезка
- Виртуальные вызовы не работают через operator[]
- Круг нужно добавлять через emplace_back
- override скрывает метод от вызова через базу
