Вопрос:

Вы разрабатываете систему рисования, где каждая фигура должна иметь метод draw(), вызываемый независимо от типа фигуры. Требуется сделать так, чтобы все производные классы реализовали этот метод, а вызов происходил через указатель на базовый тип. Важно, чтобы при удалении объекта через указатель на базу память освобождалась корректно. Какой подход к решению данной задачи соответствует требованиям надежной архитектуры на основе полиморфизма?

Ответ:

Решение:

Для обеспечения полиморфизма и корректного удаления объектов при работе через указатель на базовый тип, необходимо использовать виртуальные функции. Это позволяет вызывать правильную реализацию метода из производного класса, а также гарантирует корректное освобождение памяти при удалении объекта через базовый указатель.

  1. Объявить draw() как чисто виртуальную функцию, а деструктор базового класса сделать виртуальным.
    Чисто виртуальная функция (= 0) обязывает производные классы реализовать метод draw(). Виртуальный деструктор в базовом классе гарантирует, что при удалении объекта через указатель на базовый тип будет вызван деструктор соответствующего производного класса, что предотвращает утечки памяти и некорректное освобождение ресурсов.

Обоснование:

  • Обычная функция в базовом классе: Не обеспечит полиморфизма при вызове через указатель на базу. Вызываться будет реализация базового класса, а не производного.
  • Виртуальная функция без реализации: Обеспечивает полиморфизм, но не гарантирует корректное удаление без виртуального деструктора.
  • Виртуальная функция с реализацией в базовом классе: Обеспечивает полиморфизм, но если в производных классах метод не переопределен, будет вызвана реализация базового класса. Для корректного удаления также нужен виртуальный деструктор.

Ответ: Объявить draw() как чисто виртуальную функцию, а деструктор базового класса сделать виртуальным – это также обеспечит полиморфизм и безопасность при удалении объектов.

Подать жалобу Правообладателю