Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

16.2.6. Порівняння раннього зв'язування з пізнім

Під час обговорення об'єктно-орієнтованих мов програмування зазвичай використовують два терміни: раннє зв'язування (early binding) і пізнє зв'язування (late binding). У мові програмування C++ ці терміни пов'язують з подіями, які відбуваються під час компілювання та у період виконання програми відповідно.

При ранньому зв'язуванні виклик функції готується під час компілювання, а при пізньому – у процесі виконання програми.

Раннє зв'язування означає, що вся інформація, необхідна для виклику функції, відома під час компілювання програми. Прикладами раннього зв'язування можуть слугувати виклики стандартних функцій і виклики перевантажених функцій (звичайних і операторних). З принципових переваг раннього зв'язування можна назвати ефективність: воно працює швидше від пізнього і часто вимагає менших витрат пам'яті. Його основний недолік – відсутність гнучкості.

Пізнє зв'язування означає, що точне рішення про виклик функції буде ухвалено у процесі виконання програми. Пізнє зв'язування у мові програмування C++ досягається за рахунок використання віртуальних функцій і похідних типів. Перевага пізнього зв'язування полягає у тому, що воно забезпечує великий ступінь гнучкості. Його можна застосовувати для підтримки загального інтерфейсу і давати змогу при цьому різним об'єктам, які використовують цей інтерфейс, визначати їх власні реалізації. Понад це, пізнє зв'язування може допомогти програмісту у створенні бібліотек класів, що характеризуються багатократним використанням і можливістю розширюватися. Але до його недоліків можна віднести, хоч і незначне, але все таки пониження швидкості виконання програм.

Відповідь на запитання: чому віддати перевагу – ранньому або пізньому зв'язуванню, залежить від призначення Вашої програми1. Пізнє зв'язування (його ще називають динамічним)це один з найпотужніших засобів мови програмування C++. Проте за цю потужність доводиться розплачуватися втратами у швидкості виконання програм. Тому пізнє зв'язування краще за все використовувати тільки у разі, коли воно істотно покращує структуру і керованість програмою. Як і всі практичні засоби, пізнє зв'язування, зазвичай, варто використовувати, але не зловживати ним. Викликані ним втрати у продуктивності є дуже незначні, тому, коли ситуація вимагає пізнього зв'язування, сміливо беріть його на озброєння.

16.2.7. Поняття про поліморфізм і пуризм

Впродовж всього навчального посібника (і зокрема, у цьому розділі) ми відзначаємо відмінності між динамічним і статичним поліморфізмом. Статичний поліморфізм (поліморфізм часу компілювання) реалізується у перевантаженні функцій і операторів. Динамічний поліморфізм (поліморфізм часу виконання програми) досягається за рахунок віртуальних функцій. Найзагальніше визначення поліморфізму поміщене у фразі "один інтерфейс, багато методів", і всі згадані вище "знаряддя" поліморфізму відповідають цьому визначенню. Проте під час використання самого терміну поліморфізм все ж таки існують деякі розбіжності.

Деякі пуристи (у цьому випадку – борці за чистоту термінології) об'єктно-орієнтованого програмування наполягають на тому, щоб цей термін використовувався тільки для подій, які відбуваються у процесі виконання програм. Вони стверджують, що поліморфізм підтримується тільки віртуальними функціями. Частково ця точка зору ґрунтується на тому факті, що найпершими поліморфічними мовами програмування були інтерпретатори (для них характерним є те, що всі події належать часу виконання програми). Поява трансльованих поліморфічних мов програмування розширила концепцію реалізації поліморфізму. Однак все ще не утихають заяви про те, що термін поліморфізм повинен застосовуватися виключно до подій періоду виконання програми. Більшість С++-програмістів не погоджуються з цією точкою зору і вважають, що цей термін можна застосовувати до обох видів засобів. Тому Ви не повинні дивуватися, якщо хтось раптом стане сперечатися з Вами на предмет використання цього терміна!

Розділ 17. Шаблони в класах

Шаблон – це один з найскладніших і потужних засобів мови програмування C++. Він не увійшов до початкової специфікації мови C++, і тільки декілька років тому став невід'ємною частиною програмування нею. Шаблони дають змогу досягти одне з найважчих завдань у програмуванні – створювати програмний код, який можна використовувати багато разів.

Використовуючи шаблони, можна створювати узагальнені функції та класи. В узагальненій функції (або класі) оброблюваний нею (ним) тип даних задається як параметр. Таким чином, одну і ту саму функцію або клас можна використовувати для різних типів даних, не вказуючи безпосередньо конкретні версії для оброблення кожного типу даних. Розгляду узагальнених функцій і узагальнених класів якраз і присвячено даний розділ.