ного методу (компонентної функції) базового класу вживається повне ім'я.
Всі вище сказане можна об'єднати в ПРАВИЛА:
1) НЕ оголошувати static;
2) Оголошення віртуальних функцій в похідних класах повинні мати ту ж сигнатуру, що і в базовому. Вказувати специфікатор virtual в цьому випадку не обов'язково.
3) Віртуальна функція повинна бути обов'язково визначена або бути чистою віртуальної функцією.
Чистої віртуальної функцією називається компонентна функція, яка має таке визначення:
virtual тип імя_функциі (список формальних параметрів) = 0;
У Цей запис конструкція "= 0" називається "чистий специфікатор". Приклад опису чистої віртуальної функції:
virtual void F () = 0;
Чистий віртуальна функція у визначенні класу показує, що її визначення відкладається до похідних класів. Чистий віртуальна функція "нічого не робить" і недоступна для дзвінків. Її призначення - служити основою для підміняють її функцій у похідних класах і показувати, що даний клас абстрактний.
3. Абстрактні класи
Абстрактні класи можуть використовуватися тільки в якості базових для інших класів. Передбачається, що абстрактний клас містить одну або кілька чистих віртуальних функцій.
Визначати об'єкти абстрактного класу не можна, але можна визначати посилання або вказівник на абстрактний клас. Не можна використовувати абстрактний клас як параметр функції. Похідний від абстрактного класу також вважається абстрактним, якщо в ньому не визначена хоча б одна чиста віртуальна функція.
Як всякий клас, абстрактний клас може мати явно певний конструктор. З конструктора можливий виклик методів класу, але будь-які прямі або опосередковані звернення з конструктора до чистих віртуальним функціям приведуть до помилок під час виконання програми.
Механізм абстрактних класів розроблений для представлення загальних понять, які надалі передбачається конкретизувати. Ці загальні поняття зазвичай неможливо використовувати безпосередньо, але на їх основі можна, як на базі, побудувати приватні похідні класи, придатні для опису конкретних об'єктів.
Таким чином, механізм абстрактних класів використовується при створенні складних ієрархій успадкування.
В якості ілюстрації вище сказаного розглянемо приклад для розрахунку площі трикутника і прямокутника:
// Створення абстрактного класу
# include
class area
{double dim1, dim2;// розміри фігури
public:
void setarea (double dim1, double dim2)
{dim1 = d1;
dim2 = d2;
}
void getdim (double & dim1, double & dim2)
{d1 = dim1;
d2 = dim2;
}
virtual double getarea () = 0;// чиста віртуальна функція
};
class rectangle: public area
{public:
double getarea ()
{double d1, d2;
getdim (d1, d2);
return d1 * d2;
}
};
class triangle: public area
{public:
double getarea ()
{double d1, d2;
getdim (d1, d2);
return 0.5 * d1 * d2;
}
};
int main ()
{area * p;
rectangle r;
triangle t;
r.setarea (3.3,4.5);
t.setarea (4.0,5.0);
p = &r;
cout <<"Площа прямокутника:" <
getarea () <<' n';
p = &t;
cout <<"Площа трикутника:" <
getarea () <<' n';
return 0;
}
Тепер те, що функція getarea () є чистою віртуальної, гарантує її обов'язкову підміну в кожному похідному класі.
4. Віртуальні класи
При такому спадкуванні може виникнути проблема у спадкуванні двох примірників полів класу A в класі D через B і C (буде зайнята зайва пам'ять і виникне плутанина). Щоб це уникнути, потрібно при створенні B і C оголосити клас віртуальним. br/>
class B: virtual public A
{ ... }
class C: virtual public A { ... }
class D: public C, public B
У цьому випадку послідовність у створенні об'єктів класу D буде наступною: спочатку викликається конструктор класу А (Викликається один раз), потім конструктори В і С, останнім викликається конструктор класу D. Знищення об'єктів класу D виробляється в зворотному порядку.
5. Шаблони
Шаблони являють собою узагальнені оголошення, з яких компілятор може створювати функції чи класи з заданими параметрами. Шаблони дозволяють користувачам оперувати параметризрвані типами. Маючи реалізацію шаблону, користувачеві немає необхідності переписувати функції для конкретних типів даних.
Шаблони функцій
Оголошення шаблону функцій виглядає наступним чином:
template <список аргументів>
заголовок функції
{тіло функції}