|
|||||||||||||||||||||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
АБСТРАКТНІ КЛАСИ І ЧИСТІ ВІРТУАЛЬНІ ФУНКЦІЇ_________________________________________
Базовий клас, об’єкти якого ніколи не будуть реалізовані, називається абстрактним класом. Такий клас може існувати з єдиною метою – бути батьківським по відношенню до похідних класів, об’єкти яких будуть реалізовані. Ще він може служити ланкою для створення ієрархічної структури класів.
Чиста віртуальна функція – це функція, після оголошення якої доданий вираз = 0. Синтаксис: virtual тип назва_функції (список_форм._параметрів)=0; Чиста віртуальна функція нічого не робить і недоступна для виклику. Її призначення – служити основою для функцій, що підміняють її, в похідних класах. Абстрактний клас може використовуватися тільки як базовий для похідних класів. Механізм абстрактних класів розроблений для представлення загальних понять, які надалі передбачається конкретизувати. При цьому побудова ієрархії класів виконується по наступній схемі. На чолі ієрархії стоїть абстрактний базовий клас. Він використовується для наслідування інтерфейсу. Похідні класи конкретизуватимуть і реалізують цей інтерфейс. У абстрактному класі оголошені чисті віртуальні функції, які по суті є абстрактними методами. Приклад. 21.3. Class Base { public: Base(); // конструктор за замовчуванням Base(const Base&); // конструктор копіювання virtual ~Base(); // віртуальний деструктор virtual void Show()=0; // чиста віртуальна функція // інші чисті віртуальні функції protected: // захищені члени класу private: // часто залишається порожнім, інакше заважатиме майбутнім розробкам }; class Derived: virtual public Base { public: Derived(); // конструктор за замовчуванням Derived(const Derived&); // конструктор копіювання Derived(параметри); // конструктор з параметрами virtual ~Derived(); // віртуальний деструктор void Show(); // перевизначена віртуальна функція // інші перевизначені віртуальні функції protected: // використовується замість private, якщо очікується наслідування private: // використовується для деталей реалізації }; Об’єкт абстрактного класу не може бути формальним параметром функції, проте формальним параметром може бути вказівник на абстрактний клас. В цьому випадку з’являється можливість передавати у функцію, що викликається, як фактичний параметр значення вказівника на похідний об’єкт, замінюючи ним вказівник на абстрактний базовий клас. Таким чином ми отримуємо поліморфні об’єкти. Абстрактний метод може розглядатися як узагальнення перевизначення. У обох випадках поведінка батьківського класу змінюється для нащадка. Для абстрактного методу, проте, поведінка просто не визначена. Будь-яка поведінка задається в похідному класі. Одна з переваг абстрактного методу є чисто концептуальною: програміст може в думках наділити потрібною дією абстракцію скільки завгодно високого рівня.
Є і друга, актуальніша причина використання абстрактного методу. У об’єктно-орієнтованих мовах програмування із статичними типами даних, до яких відноситься і С++, програміст може викликати метод класу, тільки якщо компілятор може визначити, що клас дійсно має такий метод.
Продемонструємо приклад VirtPure: Лістинг 21.4. Програма VirtPure:
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.) |