Реалізація на мові c
5.3.3. виклик операцій
У мові C ++ операція (метод) визначається як один з членів класу. При виклику операції використовуються ті ж позначення, що і при зверненні до атрибутів: операція вибору члена "->" застосовується до відповідного вказівником:
Параметрами операції можуть бути значення одного з вбудованих типів (int, float, char і т.п.), або значення типів, визначених за допомогою typedef, або об'єкти деяких класів, або покажчики змінних і констант перерахованих типів, або покажчики об'єктів.
Ім'я атрибута або операції, що використовується в якості ідентифікатора в реалізації методу неявно посилається на відповідні члени об'єкта, до якого застосовується операція. У наступному прикладі x і y є атрибутами об'єкта класу Shape, до якого буде застосована операція move:
Це еквівалентно застосуванню неявного параметра this, значенням якого завжди є покажчик об'єкта, до якого застосовується операція. Наступний фрагмент програми еквівалентний попередньому:
5.3.4. Використання успадкування
У мові C ++ успадкування встановлюється тільки при складанні програми і не може бути змінено в процесі її виконання. Поведінка кожного об'єкта повністю визначається класом цього об'єкта і однаково для всіх об'єктів даного класу. Всі характеристики успадкування однакові для всіх об'єктів кожного класу.
Список суперкласів (якщо він не порожній) вказується на початку визначення кожного класу; підклас називається також похідним класом. У наступному прикладі наведено опис класу Item, а також опису підкласу Shape класу Item і підкласів Box і Circle класу Shape:
Члени суперкласу (атрибути і операції) успадковуються його підкласами (члени, визначені в суперкласі, є у всіх його підкласів). Члени суперкласу, визначені в ньому як private, недоступні для операцій його підкласів; для операцій підкласів доступні члени суперкласу, визначені в ньому protected і як public. Методи, визначені в суперкласі, можуть бути перевизначені в (деяких) його підкласах, якщо вони визначені як віртуальні (virtual). Наприклад, метод write класу Shape може бути перевизначений в його підкласах Box і Circle, тому він визначений як віртуальний; методи і в підклас не перевизначаються, тому їх можна не оголошувати як віртуальні. Якщо у визначенні віртуального методу вказана його "ініціалізація" до 0 (virtual void write (Color color) = 0;), то він обов'язково повинен бути перевизначений в кожному його підкласі (такий метод називається абстрактним). Клас, що містить хоча б один абстрактний метод, також називається абстрактним. Для абстрактних класів не можна породжувати об'єкти (об'єкти визначені тільки для його підкласів). Якщо всі методи класу визначені як абстрактні, то кажуть, що такий (абстрактний) клас визначає інтерфейс. реалізований в його підкласах.
У мові C ++ підтримується множинне спадкування. кожен клас може мати один або кілька суперкласів.
5.3.5. Реалізація залежностей
Залежності в мові C ++ реалізуються за допомогою покажчиків або за допомогою спеціальних об'єктів. Наприклад, залежність "багато-до-одного" між класами Item і Group реалізована через покажчики:
Кожен раз, коли до залежності додається (або з неї видаляється) зв'язок, обидва покажчика повинні бути змінені:
Методи Group :: add_item і Group :: remove_item можуть змінювати приватні (private) атрибути класу Item, хоча вони визначені в його підкласі Group, так як вони визначені як дружні (friends) для класу Item.
У розглянутому прикладі опущені перевірки:- чи не є включається в групу графічний об'єкт вже членом цієї групи: в цьому випадку його нема чого ще раз включати в групу;
- чи не є включається в групу графічний об'єкт членом будь-якої іншої групи: в цьому випадку його не можна включати в групу і необхідно видати на екран відповідне повідомлення.
Іноді пов'язані між собою (залежні) об'єкти включають в так звані колективні класи. Як приклад такого класу розглянемо клас ItemSet (набір об'єктів):
Залежності між класами можна реалізувати і за допомогою спеціальних класів (кожен об'єкт такого класу описує зв'язок між об'єктами відповідних класів). В цьому випадку атрибути класу відповідають атрибутам описуваної їм залежності.
5.3.6. Шаблони в мові C ++
У мові C ++ можливо і параметричне програмування (програмування з використанням родових компонентів). Родові (параметризрвані) компоненти мають властивість адаптивності до конкретної ситуації, в якій такий компонент використовується, що дозволяє розробляти досить універсальні і в той же час високоефективні компоненти програм (зокрема, об'єкти).
Параметричне програмування в мові C ++ реалізовано за допомогою шаблонів (template). У C ++ визначено два види шаблонів: шаблони-класи та шаблони-функції.
Шаблони-класи можуть використовуватися багатьма способами, але найбільш очевидним є їх використання в якості адаптивних об'єктів пам'яті. Шаблони-функції можуть використовуватися для визначення параметрезованих алгоритмів. Основна відмінність шаблону-функції від шаблону-класу в тому, що не потрібно повідомляти компілятору, до яких типів параметрів застосовується функція, він сам може визначити це за типами її формальних параметрів.
NYU / STL / STL.html. Нарешті, реалізація поточної версії STL доступна по ftp://ftp.cs.rpi.edu/pub/stl.