Ответ:
Решение:
Для обеспечения полиморфизма и корректного удаления объектов при работе через указатель на базовый тип, необходимо использовать виртуальные функции. Это позволяет вызывать правильную реализацию метода из производного класса, а также гарантирует корректное освобождение памяти при удалении объекта через базовый указатель.
- Объявить draw() как чисто виртуальную функцию, а деструктор базового класса сделать виртуальным.
Чисто виртуальная функция (= 0) обязывает производные классы реализовать методdraw(). Виртуальный деструктор в базовом классе гарантирует, что при удалении объекта через указатель на базовый тип будет вызван деструктор соответствующего производного класса, что предотвращает утечки памяти и некорректное освобождение ресурсов.
Обоснование:
- Обычная функция в базовом классе: Не обеспечит полиморфизма при вызове через указатель на базу. Вызываться будет реализация базового класса, а не производного.
- Виртуальная функция без реализации: Обеспечивает полиморфизм, но не гарантирует корректное удаление без виртуального деструктора.
- Виртуальная функция с реализацией в базовом классе: Обеспечивает полиморфизм, но если в производных классах метод не переопределен, будет вызвана реализация базового класса. Для корректного удаления также нужен виртуальный деструктор.
Ответ: Объявить draw() как чисто виртуальную функцию, а деструктор базового класса сделать виртуальным – это также обеспечит полиморфизм и безопасность при удалении объектов.
