- •8.2.1. Реалізація класів
- •8.2.2. Породження об’єктів
- •8.2.3. Виклик операцій
- •8.2.4. Використання успадкування
- •8.2.5. Реалізація залежностей
- •8.2.6. Шаблони, шаблони-класи
- •Параметри шаблонів, що опускаються
- •Приклади, які використовують вектори символів
- •8.2.8. Основні компоненти stl
- •8.2.8.1. Контейнери
- •Контейнери послідовностей
- •Впорядковані асоціативні контейнери
- •8.2.8.2. Параметричні (родові) алгоритми
- •8.2.8.3. Ітератори
- •8.2.8.4. Об’єкти-функції
- •8.2.8.5. Адаптери
- •8.2.8.6. Алокатори
- •8.2.9. Stl та об’єктно-орієнтоване програмування
8.2.3. Виклик операцій
У мові С++ операція (метод) визначається як один з членів класу. При виклику операцій використовуються ті самі значення, що й при зверненні до атрибутів: операція вибору члена «->» застосовується щодо відповідного покажчика:
Shape* shape;
Shape->move (dx,dy);
Параметрами операції можуть бути значення одного з вбудованих типів (int, float, char і т.п.), або значення типів, визначених за допомогою typedef, або об’єкти деяких класів, або покажчики змінних та констант перелічених типів, або покажчики об’єктів.
Ім’я атрибута чи операції, котра використовується як ідентифікатор у реалізації методу, неявно відсилається на відповідні члени об’єкта, до якого застосовується операція. У наступному прикладі x та y є атрибутами об’єкта класу Shape, до якого буде застосована операція move:
void Shape::move (Length deltax, Length deltay)
{
x = x + deltax;
y = y + deltay;
}
Це еквівалентне застосуванню неявного параметра this, значенням якого завжди є покажчик об’єкта, до якого застосовується операція. Наступний фрагмент програми еквівалентний попередньому;
void Shape::move (Length deltax, Length deltay)
{
this x = this x + deltax;
this y = this y + deltay;
}
Посилання на який-небудь інший об’єкт за описом операції має обов’язково бути кваліфікованим (містити в собі покажчик відповідного об’єкта):
Window->Xmin = x1;
8.2.4. Використання успадкування
У мові С++ наслідування установлюється тільки при складанні програми і не може бути змінене в процесі її використання. Поведінка кожного об’єкта повністю визначається класом цього об’єкта та однакова для всіх об’єктів даного класу. Всі характеристики успадкування однакові для всіх об’єктів кожного класу.
Список суперкласів (якщо він не порожній) вказує спочатку визначення кожного класу; підклас називається також похідним класом. У наступному прикладі наведено опис класу Item, а також опис підкласу Shape класу Item та підкласів Box та Circle класу Shape:
class Item
{
public:
virtual void cut ();
virtual void move (Length deltax, Length deltay)=0;
virtual Boolean pick (Length px; Length py)=0;
virtual void ungroup ()=0;
};
class Shape: public Item
{
protected:
Length x;
Length y;
public:
void cut ();
void draw () {write (COLOR_FOREGROUND);};
void erase () {write (COLOR_BACKGROUND);};
Boolean pick (Length px; Length py);
void ungroup () {};
virtual void write (Color color)=0;
};
class Box: public Shape
protected:
Length width;
Length height;
public:
Box (Length x0, Length y0, Length width0, Length height0);
Boolean pick (Length px; Length py);
void write (color color);
};
class Circle: public Shape
{
protected:
Length radius
public:
Circle (Length x0, Length y0, Length radius0);
Boolean pick (Length px; Length py);
void write (Сolor color);
};
Члени суперкласу (атрибути та операції) успадковуються його підкласами (члени, які визначені в суперкласі, належать всім його підкласам). Члени суперкласу, визначені в ньому як private, недоступні для операцій його підкласів. Для операцій підкласів доступні члени суперкласу, визначені в ньому як protected та public. Методи, визначені в суперкласі, можуть бути перевизначені у (деяких) його підкласах, якщо вони визначені як віртуальні (virtual). Наприклад, метод write класу Shape може бути перевизначений в його підкласах Box та Circle, тому він визначений як віртуальний. Методи в підкласах не перевизначаються, тому їх можна не оголошувати як віртуальні. Якщо у визначенні віртуального методу вказана його «ініціалізація» до 0 (virtual void write (Color color) = 0;), то він обов’язково повинен бути перевизначений у кожному його підкласі (такий метод називається абстрактним). Клас, який містить у собі хоча б один абстрактний метод, також називається абстрактним. Для абстрактних класів не можна породжувати об’єкти (об’єкти визначені лише для його підкласів). Якщо всі методи класу визначені як абстрактні, то говорять, що такий (абстрактний) клас визначає інтерфейс, реалізовуваний у його підкласах.
У мові С++ підтримується множинне успадкування: кожний клас може мати один чи кілька суперкласів.
