В объектно-ориентированном программировании для реализации полиморфизма, когда метод базового класса должен вести себя по-разному в зависимости от конкретного типа объекта, используется механизм виртуальных функций.
Объявление метода draw() виртуальным в базовом классе Shape позволяет компилятору во время выполнения программы определить фактический тип объекта (например, Circle, Rectangle) и вызвать соответствующую переопределенную версию метода draw().
Остальные варианты не подходят:
Ответ: Объявить draw() виртуальной в базовом классе.