Як зробити клас абстрактним

Чи можна створити абстрактний клас?

Неможливо створити об'єкт абстрактного типу класу. Однак можна використовувати покажчики та посилання на абстрактні типи класів.

Як оголосити абстрактний клас?

Абстрактний клас оголошується при описі класу: додають оператора abstract перед оператором class. Абстрактні класи Java не можна ініціалізувати як об'єкт, але від них можна успадковуватись. Абстрактний метод Java – це метод, який оголошено, але в ньому не описано логіки, тобто метод не реалізований.

Коли клас стає абстрактним?

Абстрактний клас – це клас, у якого не реалізовано один чи більше методів (Деякі мови вимагають такі методи позначати спеціальними ключовими словами). Інтерфейс – це абстрактний клас, у якого жоден метод не реалізований, всі вони публічні і немає змінних класу.

Абстрактні класи (C++)

Абстрактні класи використовуються як узагальнені концепції, на основі яких можна створювати більш конкретні похідні класи. Неможливо створити об'єкт абстрактного типу класу. Однак можна використовувати покажчики та посилання на абстрактні типи класів.

Ви створюєте абстрактний клас, оголосивши принаймні одну чисту віртуальну функцію-член. Це віртуальна функція, оголошена за допомогою синтаксису чистого описувача (= 0). Класи, похідні від абстрактного класу, мають реалізовувати суто віртуальну функцію; інакше вони також будуть абстрактними.

Розглянемо приклад, поданий у розділі Віртуальні функції. Клас Account створений для того, щоб надавати спільні функції, але об'єкти типу Account мають надто загальний характер для практичного застосування. Це означає, що Account є хорошим кандидатом для абстрактного класу:

// deriv_AbstractClasses.cpp // compile with: /LD class Account < public: Account( double d ); // Constructor. virtual double GetBalance(); // Obtain balance. virtual void PrintBalance() = 0; / / Pure virtual function. private: double _balance; >; 

Єдина відмінність між цим та попереднім оголошеннями полягає в тому, що функція PrintBalance оголошена зі специфікатором суто віртуальної функції pure (= 0).

Обмеження використання абстрактних класів

Абстрактні класи не можна використовувати для:

  • змінних та даних членів;
  • типів аргументів;
  • типів значень, що повертаються функціями;
  • типів явних перетворень.

Якщо конструктор абстрактного класу викликає чисту віртуальну функцію прямо чи опосередковано, результат не визначено. Однак конструктори та деструктори абстрактних класів можуть викликати інші функції-члени.

Певні чисті віртуальні функції

Чисті віртуальні функції в абстрактних класах можуть бути визначено чи мати реалізацію. Такі функції можна викликати лише за допомогою повного синтаксису:

Певні чисті віртуальні функції корисні для проектування ієрархій класів, базові класи яких включають чисті віртуальні деструктори. Це з тим, що деструктори базового класу завжди викликаються під час знищення об'єктів. Розглянемо наступний приклад.

// deriv_RestrictionsOnUsingAbstractClasses.cpp // Declare abstract base class with pure virtual destructor. // It's the simplest possible abstract class. class base < public: base() <>// To define the virtual destructor outside the class: virtual ~base() = 0; // Microsoft-specific expandion to define it inline: // virtual ~base() = 0 <>; >; base::~base() <> // required if not using Microsoft extension class derived : public base < public: derived() <>~derived() <> >; int main() < derived aDerived; / / Destructor називається, коли його виходять з scope >

У прикладі показано, як розширення компілятора Майкрософт дозволяє додати вбудоване визначення до чистої віртуальної . ~base() Ви також можете визначити його за межами класу за допомогою base::~base() <> .

Коли об'єкт aDerived виходить з області, викликається деструктор класу derived . Компілятор створює код для неявного виклику деструктора для класу base після derived деструктора. Порожня реалізація чистої віртуальної функції ~ base гарантує, що для функції існує принаймні деяка реалізація. Без цього компонувальник створює помилку зовнішнього символу для неявного виклику.

У попередньому прикладі чиста віртуальна функція base::~base викликається неявно з derived::~derived . З іншого боку, можна явно викликати чисті віртуальні функції, використовуючи повне ім'я функції-члена. Такі функції повинні мати реалізацію, інакше виклик призводить до помилки під час зв'язування.


Categories:

Tags:


Comments

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *