ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн
Позднее связывание
Любознательный читатель может удивиться, как же компилятор узнает, какую
именно функцию ему компилировать? В программе NOTVIRT у компилятора нет
проблем с выражением
ptr->show();
Он всегда компилирует вызов функции show() из базового класса. Однако в
программе VIRT компилятор не знает, к какому классу относится содержимое ptr.
Ведь это может быть адрес объекта как класса Derv1, так и класса Derv2. Какую
именно версию draw() вызывает компилятор — тоже загадка. На самом деле
компилятор не очень понимает, что ему делать, поэтому откладывает принятие
решения до фактического запуска программы. А когда программа уже поставле-
на на выполнение, когда известно, на что указывает ptr, тогда будет запущена
соответствующая версия draw. Такой подход называется поздним связыванием
или динамическим связыванием. (Выбор функций в обычном порядке, во время
компиляции, называется ранним связыванием или статическим связыванием.)
Позднее связывание требует больше ресурсов, но дает выигрыш в возможностях
и гибкости.
Вскоре мы претворим эти идеи в жизнь, а сейчас вернемся к виртуальным
функциям.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
