bject -> draw ( view, camera );

какая конкретно функция будет вызвана у объекта object, определяется уже на этапе выполнения и зависит от реального (а не декларированного) типа неременной object. Существует возможность для пользователя уже после ta першения работы над библиотекой классов (например, для проверок на с 1 олкновение или рендеринга сложных объектов) добавлять новые классы, унаследованные от базовых, переопределив некоторые их методы. Тогда написанный пользователем класс будет корректно работать с библиотекой, несмотря на то что библиотека была написана и откомпилирована задолго до написания соответствующего класса. Можно даже добавлять новые к 1ассы прямо в ходе выполнения программы (подобная функциональность Оудет рассмотрена во второй части работы).

Важно отличать полиморфизм, предоставляемый через механизм наследования (т. е. фактически следование объявленному протоколу) от использования макросов или шаблонов (templates) языка С++. В последнем случае мы имеем дело фактически с макропрограммированием, причем довольно слабым. Все опять определяется па этапе компиляции и отличается от использования конструкции #define только встроенной проверкой типов. Кроме того, степень поддержки шаблонов довольно сильно меняется от компилятора к компилятору.

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

Именно исходя из этих соображений в рассматриваемом проекте почти не используются шаблоны и библиотека STL, целиком построенная на них. Также не используется пресловутая модель СОМ, которая является слишком сложной и неудобной для практической работы (за исключением разве что пользователей языка Visual Basic, в основном для которых она и была создана).


⇐ Предыдущая| |Следующая ⇒