МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів
Контакти
Тлумачний словник Авто Автоматизація Архітектура Астрономія Аудит Біологія Будівництво Бухгалтерія Винахідництво Виробництво Військова справа Генетика Географія Геологія Господарство Держава Дім Екологія Економетрика Економіка Електроніка Журналістика та ЗМІ Зв'язок Іноземні мови Інформатика Історія Комп'ютери Креслення Кулінарія Культура Лексикологія Література Логіка Маркетинг Математика Машинобудування Медицина Менеджмент Метали і Зварювання Механіка Мистецтво Музика Населення Освіта Охорона безпеки життя Охорона Праці Педагогіка Політика Право Програмування Промисловість Психологія Радіо Регилия Соціологія Спорт Стандартизація Технології Торгівля Туризм Фізика Фізіологія Філософія Фінанси Хімія Юриспунденкция |
|
|||||||
Абстрактні класиРозглянемо приклад з попереднього параграфа. Оголосили базовий клас Іtem, який представляє загальні властивості всіх одиниць зберігання в бібліотеці. Але чи існують об'єкти класу Item? Тобто чи існує насправді "одиниця зберігання" сама по собі. Звичайно, кожна книга (клас Book), журнал (клас Magazin) і т.д. належать і до класу Іtem, оскільки вони успадковані з нього, проте об'єкт самого базового класу навряд чи має сенс. Базовий клас ‑ це деяке абстрактне поняття, що описує загальні властивості інших, конкретних об'єктів. Ряд методів базового класу не можуть бути реалізовані в ньому, а повинні бути реалізовані в породжених класах. Реалізація методу Name в базовому класі досить умовна, вона не має особливого сенсу. Було б набагато логічніше взагалі не реалізовувати цей метод в базовому класі, а залишити його на відповідальності похідних класів. З другого боку нам важливий факт наявності методу Name у всіх похідних класах і те, що цей метод віртуальний. Саме тому ми можемо працювати з вказівниками (або посиланнями) на об'єкти базового класу не знаючи точно, на який саме з похідних класів цей вказівник вказує. Віртуальний механізм під час виконання програми сам розбереться і викличе потрібну реалізацію методу Name. Така ситуація складається досить часто в об'єктно-орієнтованому програмуванні. (Пригадайте приклад з різними формами в графічному редакторі. Малювання якоїсь узагальненої форми неможливе.) В подібних випадках використовується механізм абстрактних класів. Запишемо базовий клас Іtem трохи по-іншому:
class Item { public: virtual String Name() const = 0; };
Тепер визначено метод Name як чисто віртуальний. Клас, у якого є хоча б один чисто віртуальний метод, називається абстрактним. Те, що метод оголошений чисто віртуальним, вимагає, щоб цей метод зобов'язаний бути визначений у всіх класах, похідних від Іtem. Наявність чисто віртуального методу забороняє створення об'єкту типу Іtem. В програмі можна використовувати вказівники або посилання на тип Item. Записи:
Item it; Item* itptr = new Item;
не дозволені, компілятор повідомить про помилку. Проте цілком можна записати:
Book b; Item* itptr = &b; Item& itref = b;
Відзначимо, що визначивши чисто віртуальний метод в класі Book, в наступному рівні спадкування його вже не обов'язково перевизначати (в класах, похідних з Book). Якщо з яких-небудь причин в похідному класі чисто віртуальний метод не визначений, то цей клас теж буде абстрактним і будь-які спроби створити об'єкт даного класу викликатимуть помилку. Таким чином, забути визначити чисто віртуальний метод просто неможливо. Абстрактний базовий клас нав'язує певний інтерфейс всім похідним від нього класам. Власне в цьому і полягає головне призначення абстрактних класів ‑ у визначенні інтерфейсу для всієї ієрархії класів. Зрозуміло, це не означає, що в абстрактному класі не може бути певних методів або атрибутів. Взагалі кажучи, клас можна зробити абстрактним, навіть якщо всі його методи визначені. Іноді це необхідне зробити для того, щоб бути упевненим в тому, що об'єкт даного класу не буде ніколи створений. Можна визначити один з методів як чисто віртуальний, але проте визначити його реалізацію. Звичайно для цих цілей вибирається деструктор:
class А { public: virtual ~A() = 0; }; A :: ~A() { . . . }
Клас A - абстрактний, і об'єкт типу А створити неможливо. Проте деструктор його визначений і буде викликаний при знищенні об'єктів похідних класів.
Читайте також:
|
||||||||
|