Вступ до абстрактного класу на C ++

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

Коли ми хочемо вивести деякі поведінки або характеристики з одного класу в інший клас, ми використовуємо поняття успадкування. Це метод успадкування кількох властивостей від батьківського класу (базового класу) до дочірнього класу (похідного класу).

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

Абстрактний клас - це клас із чисто віртуальною функцією. Тепер, що є чистою віртуальною функцією? Чиста віртуальна функція - це віртуальна функція, яка не має тіла і призначена як 0. Цей тип функції реалізується тоді, коли нам потрібна функція, але в даний час ми не знаємо, що це за функція. Цю функцію потрібно реалізувати або визначити у похідному класі. Якщо ні, то похідний клас також стає абстрактним класом.

Чиста віртуальна функція визначається наступним чином:

virtual void func () = 0;

Приклад абстрактного класу на C ++

Тут ми обговорюємо Приклад абстрактного класу на C ++ з деталями:

#include
using namespace std;
class Sample_Class (
int a = 5;
public:
virtual void sample_func() = 0;
void print_func() (
cout << a;
)
);
class Derived_Class : public Sample_Class (
public:
void sample_func() (
cout << "pure virtual function is implemented";
)
);
int main() (
Derived_Class d_object;
d_object.sample_func();
)

Вихід:

Тут Sample_Class є базовим класом, а Derived_Class є похідним від Sample_Class. Чиста віртуальна функція під назвою sample_func () оголошена в базовому класі. Він призначається 0, що означає, що його немає нікого і нічого не реалізовано всередині функції. Таким чином, базовий клас став абстрактним класом, оскільки він має чисту віртуальну функцію. Спочатку, коли Derived_Class є похідним від базового класу, він також стає абстрактним класом. Але у похідному класі визначається клас sample_func (), що не дозволяє похідному класу стати абстрактним класом. Коли створений об'єкт класу буде створений і викликається функція, ми отримаємо результат, надрукований як "реалізована чиста віртуальна функція".

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

Вищезазначений пункт можна пояснити за допомогою програми нижче

class Class1 (
int a;
public:
virtual void func1() = 0;
void func2() (
cout << "base class";
)
);
class Class2 : public Class1 (
public:
void func1() (
cout << "func1 in derived class";
)
);
int main() (
Class1 b; //---------- > this line will cause an error
//Class1 *b = new Class2(); //---------- > pointer can be created, so this line is correct
// b -> func1();
)

Вихід:

Тут ми отримаємо помилку, оскільки об’єкт неможливо створити для абстрактного класу.

Замість цього можуть бути реалізовані 2- й та 3- й рядки коду, може бути створений покажчик і може використовуватися для виклику похідної функції класу.

Тут у наведеній вище функції Class1 є базовим класом, і оскільки він має чисту віртуальну функцію (func1), він став абстрактним класом. Клас2 походить від батьківського класу Class1. Func1 визначений у похідному класі. У головній функції, коли ми намагатимемося створити об'єкт базового класу типу, ми отримаємо помилку, оскільки об'єкти не можуть бути створені для абстрактного класу. Якщо ми намагаємося створити покажчик типу базового класу, він буде створений успішно, і ми можемо вказати його на похідний клас. Цей покажчик може використовуватися для виклику похідної функції класу.

Абстрактний клас може мати конструктор, подібний до звичайного виконання класу. У разі деструктора ми можемо оголосити чистим віртуальним деструктором. Важливо мати деструктор для видалення пам'яті, виділеної для класу. Чистий віртуальний деструктор - це деструктор, який присвоюється 0, але він повинен визначатися тим самим класом, оскільки деструктор зазвичай не перекривається.

Приклад реалізації конструктора та деструктора для абстрактного класу в C ++

Тут ми обговорюємо Приклад абстрактного класу на C ++ з деталями:

class Base (
public:
int a;
virtual void func1() = 0;
// Constructor
Base(int i) (
a = i;
)
// Pure Virtual destructor
virtual ~Base() = 0;
);
// Pure virtual destructor is defined
Base :: ~Base() (
cout << "Pure virtual destructor is defined here" << endl;
)
class Derived : public Base (
int b;
public:
// Constructor of derived class
Derived(int x, int y) : Base(y) ( b = x; )
// Destructor of derived class
~Derived() (
cout << "Derived class destructor" << endl;
)
//Definition for pure virtual function
void func1() (
cout << "The value of a is " << a << " and b is " << b << endl;
)
);
int main() (
Base *b = new Derived(5, 10);
b->func1();
delete b;
)

Вихід :

Тут, у наведеному вище прикладі, базовий клас - це абстрактний клас із чистою віртуальною функцією func1 (), конструктором та чистим віртуальним деструктором. Чиста віртуальна функція визначається у похідному класі, отже, перешкоджаючи похідному класу стати абстрактним класом. Чистий віртуальний деструктор визначається класом Base поза класом. Якщо ми хочемо визначити функцію-член класу поза класом, слід використовувати оператор роздільної здатності, як показано в прикладі. Створюється покажчик типу базового класу і вказується на похідний клас. Коли деструктор викликається за допомогою "delete", спочатку викликається деструктор похідного класу, а потім викликається деструктор базового класу.

Висновок

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

Рекомендовані статті

Це посібник з абстрактного класу на C ++. Тут ми обговорюємо вступ до абстрактного класу, а також реалізацію конструктора та деструктора в C ++ разом із його прикладом. Ви також можете переглянути наступні статті, щоб дізнатися більше -

  1. Анотація класу з Python
  2. Анотація класу на Java
  3. Конструктор і деструктор в C ++
  4. Перевищення рівня C ++
  5. Перевагу в Java
  6. Топ-11 особливостей та переваг C ++