Вектор указателей на базовый класс в C++
Хранить абстрактный тип по значению в векторе нельзя: у такого объекта нет готовых методов. Зато в вектор кладут указатели на базу.
Вектор указателей на базу хранит адреса
объектов разных потомков. В цикле вызывают
виртуальный метод, а в конце каждый адрес
освобождают через delete. У базы
деструктор объявляют виртуальным. Запишем
вектор фигур и выведем площади:
class Shape {
public:
virtual ~Shape() {}
virtual int area() const = 0;
};
class Rectangle : public Shape {
public:
int width;
int height;
Rectangle(int width, int height)
: width(width), height(height) {}
int area() const override {
return width * height;
}
};
class Square : public Shape {
public:
int side;
Square(int side) : side(side) {}
int area() const override {
return side * side;
}
};
Создадим объекты Rectangle и Square и выведем площади:
int main() {
std::vector<Shape*> figures;
figures.push_back(new Rectangle(3, 4));
figures.push_back(new Square(5));
for (Shape* figure : figures) {
std::cout << figure->area() << "\n";
}
for (Shape* figure : figures) {
delete figure;
}
return 0;
}
Создайте std::vector<Figure*>,
положите в него объекты Circle
и Rectangle через new,
выведите площадь каждой фигуры в цикле
и удалите все указатели.