Зміст:
1. Статичні елементи класу
2. Віртуальні функції
3. Абстрактні класи
4. Віртуальні класи
5. Шаблони
6. Обробка виняткових ситуацій в C + +
1. Статичні елементи класу
У класі можна визначати елементи даних і функції зі специфікатором static. У цьому випадку їх можна розглядати як глобальні змінні або функції в межах класу, і доступні вони не одному об'єкту, а розділяються між всім класом, не асоціюються з окремими представниками класу.
class Name
{ ...
public:
...
static int count;}
Для елементів, які оголошені у відкритій секції класу, виклик, наприклад, буде виглядати наступним чином:
Name :: count + = 2;
Якщо елементи визначені в закритій секції, то таке звернення некоректно.
Якщо ми оголосили такий елемент в закритій секції класу, то ми повинні визначити функції для роботи з цими елементами. Звернення до таких функцій виглядає так: Name :: Add1 ();
ПРАВИЛО:
1) Статичні функції і елементи класу не асоціюються з окремими представниками класу. Звернення до них виробляється виразом вигляду:
ім'я класу :: ім'я елемента
2) Їм не передається покажчик this, тому що він асоціюється з окремим представником класу.
3) Статичні функції можуть викликатися незалежно від того, чи існує хоча б один представник класу.
4) Статичні функції не можуть бути віртуальними.
2. Віртуальні функції
Віртуальні функції - це функції-члени класу, виклик яких здійснюється під час виконання програми (тобто динамічно) по типом об'єкта, з яким вона використовується.
Наприклад, базовий клас може описувати фігуру на екрані без конкретизації її виду, а похідні класи (коло, еліпс і т.п.) однозначно визначають її форми та розміри. Якщо в базовому класі ввести функцію для зображення фігури на екрані, то виконання цієї функції буде можливо тільки для об'єктів кожного з похідних класів, що визначають конкретні зображення.
Оголошення віртуальної функції в класі:
virtual прототіп_функціі;
Зазначимо, що класи, включають такі функції, відіграють особливу роль в об'єктно-орієнтованому програмуванні. Саме тому вони носять спеціальну назву - поліморфні. p> Повернемося до згаданого вище прикладу з фігурами. Розглянемо клас Point (похідний від Location). p> Нехай у цьому класі визначена компонентна функція void Show (). Так як зовнішній вигляд фігури, для якої буде використовуватися дана функція, в базовому класі ще не визначений, то в кожен з похідних класів потрібно включити свою функцію void Show () для формування зображення на екрані. Це не дуже зручно, тому в таких випадках використовують механізм віртуальних функцій. Будь нестатичних функція базового класу може бути зроблена віртуальної, якщо в її оголошенні використовувати специфікатор virtual.
class Point: public Location {
protected:
Boolean vis;
public:
Point (int nx, int ny);
virtual void Show ();
virtual void Hide ();
virtual void Drag (int by);
Boolean Isvis () {return vis;}
void MoveTo (int nx, int ny);};
Віртуальними можуть бути не будь-які функції, а тільки нестатичні компонентні функції -якого класу. Після того як функція визначена як віртуальна, її повторне визначення в похідному класі (з тим же самим прототипом) створює в цьому класі нову віртуальну функцію, причому специфікатор virtual може не використовуватися.
У похідному класі не можна визначати функцію з тим же ім'ям і з тією ж сигнатурою параметрів, але з іншим типом значення, що повертається, ніж у віртуальній функції базового класу. Це призводить до помилки на етапі компіляції. p> Якщо в похідному класі ввести функцію з тим же ім'ям і типом повертається значення, що і віртуальна функція базового класу, але з іншого сигнатурою параметрів, то ця функція похідного класу не буде віртуальною. У цьому випадку за допомогою покажчика на базовий клас при будь-якому значенні цього покажчика виконується звернення до функції базового класу (незважаючи на специфікатор virtual і присутність у похідному класі схожою функції).
Розглянемо, як виглядатиме виклик віртуальної функції void Show () в похідному класі:
class Circle: public Point {
protected:
int R;
public:
Circle (int nx, int ny, int nr);
void Show ();
void Hide ();
void Expand (int by);
void Contract (int by);};
Як ми бачимо, специфікатор virtual можна вже не вказувати.
Механізм віртуального виклику може бути пригнічений за допомогою явного використання повного кваліфікованого імені. Таким чином, при необхідності виклику з похідного класу віртуаль...