Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Абстрактні класи

Розглянемо приклад з попереднього параграфа. Оголосили базовий клас І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 - абстрактний, і об'єкт типу А створити неможливо. Проте деструктор його визначений і буде викликаний при знищенні об'єктів похідних класів.

 


Читайте також:

  1. II. Класифікація видатків та кредитування бюджету.
  2. V. Класифікація і внесення поправок
  3. V. Класифікація рахунків
  4. А .Маршалл - основоположник неокласичної теорії.
  5. А. Структурно-функціональна класифікація нирок залежно від ступеню злиття окремих нирочок у компактний орган.
  6. Адміністративні провадження: поняття, класифікація, стадії
  7. Аналітичні процедури внутрішнього аудиту та їх класифікація.
  8. Антагоністичні - критеріальні класифікації надто спрощені, тому дослідники
  9. Б. Некласична форма.
  10. Багатоаспектне класифікування об’єктів винаходу
  11. Базові поняття про класифікацію медичної техніки




Переглядів: 1281

<== попередня сторінка | наступна сторінка ==>
Створення та використання дружніх функцій та класів | 

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.002 сек.