ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн

Позднее связывание

Любознательный читатель может удивиться, как же компилятор узнает, какую

именно функцию ему компилировать? В программе NOTVIRT у компилятора нет

проблем с выражением

ptr->show();

Он всегда компилирует вызов функции show() из базового класса. Однако в

программе VIRT компилятор не знает, к какому классу относится содержимое ptr.

Ведь это может быть адрес объекта как класса Derv1, так и класса Derv2. Какую

именно версию draw() вызывает компилятор — тоже загадка. На самом деле

компилятор не очень понимает, что ему делать, поэтому откладывает принятие

решения до фактического запуска программы. А когда программа уже поставле-

на на выполнение, когда известно, на что указывает ptr, тогда будет запущена

соответствующая версия draw. Такой подход называется поздним связыванием

или динамическим связыванием. (Выбор функций в обычном порядке, во время

компиляции, называется ранним связыванием или статическим связыванием.)

Позднее связывание требует больше ресурсов, но дает выигрыш в возможностях

и гибкости.

Вскоре мы претворим эти идеи в жизнь, а сейчас вернемся к виртуальным

функциям.

 

6