Абстрактні класи і чисті віртуальні функції
Базовий клас, який ніколи не буде реалізованим, називається абстрактним класом. Такий клас може існувати з єдиною метою – бути батьківським по відношенню до похідних класів, об’єкти яких будуть реалізовані. Ще він може виступати як ланка при створенні ієрархічної структури класів.
Як пояснити розробникам, що використовують створену нами структуру класів, що об’єкти батьківського класу не призначені для реалізації, Можна, звичайно, заявити про це в документації, але це не захистить базовий клас від неналежного використання. Потрібно захистити його програмно. Для цього достатньо внести в клас хоч би одну чисту віртуальну функцію. Чиста віртуальна функція – це функція, після оголошення якої додано вираз =0. Приклад такої функції приведено в програмі 22.3.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<bios.h>
//////////
class Base
{public:
virtual void show()=0; //чиста віртуальна функція
};
////////////
class Derv1:public Base
{public:
void show()
{cout<<"Derv1\n";}
};
/////////////
class Derv2:public Base
{public:
void show()
{cout<<"Derv2\n";}
};
//////////////
int main()
{clrscr();
// Base bad; //помилка
Base* arr[2];
Derv1 dv1;
Derv2 dv2;
arr[0]=&dv1;
arr[1]=&dv2;
arr[0]->show();
arr[1]->show();
bioskey(0);
return 0;
}
Програма 22.3
Віртуальна функція show() оголошується як
virtual void show()=0; //чиста віртуальна функція
В цьому виразі знак рівності не має нічого спільного з операцією присвоювання. Нульове значення нічому не присвоюється. Конструкція =0 – це просто спосіб сповістити компілятору, що функція буде чистою віртуальною. Якщо тепер в головній програмі спробувати створити об’єкт типу Base, то компілятор видасть повідомлення про помилку. Пам’ятаймо, що, хоча це тільки оголошення, визначати функцію show() базового класу не обов’язково, хоча це і можна робити.
Як тільки в базовому класі виявиться чиста віртуальна функція, необхідно буде потурбуватися, щоб уникнути її використання у всіх похідних класах, які ми збираємося реалізувати. Якщо клас використовує чисту віртуальну функцію, то він сам стає абстрактним, ніякі об’єкти з нього реалізувати не вдасться. Це не стосується похідних від нього класу.
Програма 22.3 має ще одне нововведення, порівняно з попередньою: тепер адреси об’єктів зберігаються в масиві вказівників і будуть доступні як елементи цього масиву. Результат виконання програми при цьому не змінюється.
Дата добавления: 2015-08-26; просмотров: 1313;