Въведение в абстрактния клас в C ++

Класът е тип данни, определен от потребителя, и той има свои собствени членове и функции на данни. Членовете и функциите могат да бъдат използвани чрез създаване на обект или екземпляр от този клас. Паметта се разпределя за клас само когато е създаден обект.

Когато искаме да изведем някои поведения или характеристики от един клас в друг клас, използваме концепцията за наследяване. Това е методът за наследяване на няколко свойства от родителски клас (базов клас) до детски клас (производен клас).

При прилагането и наследяването на класове, когато искаме да дефинираме едни и същи функции както в базовия, така и в производния клас, използваме ключовата дума „виртуална“, заедно с функцията на базовия клас. Тази „виртуална“ функция уточнява, че същата функция е предефинирана или отменена в производния клас.

Абстрактен клас е клас с чиста виртуална функция. Сега, какво е чиста виртуална функция? Чистата виртуална функция е виртуална функция, която няма тяло и е назначена като 0. Този тип функция се реализира, когато се нуждаем от функция, но в момента не знаем каква е нейната функция. Тази функция трябва да бъде реализирана или дефинирана в извлечения клас. Ако не, тогава производният клас също се превръща в абстрактен клас.

Чистата виртуална функция се дефинира, както следва:

виртуален 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), той се превърна в абстрактен клас. Class2 се извлича от родителския клас 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;
)

Резултат :

Тук, в горния пример, Base class е абстрактен клас с чиста виртуална функция func1 (), конструктор и чист виртуален деструктор. Чистата виртуална функция е дефинирана в извлечения клас, като по този начин предотвратява извлечения клас да стане абстрактна класа. Чистият виртуален деструктор се определя от клас Base извън класа. Ако искаме да определим функцията член на клас извън класа, трябва да се използва операторът за разделяне на обхвата, както е показано в примера. Създава се указател от типа на базовия клас и се насочва към производния клас. Когато деструкторът се извиква с помощта на „изтриване“, първо се извиква деструктора на производен клас и след това се извиква разрушителят на базовия клас.

заключение

Следователно, за да компилираме всичко за абстрактния клас, можем да кажем, че абстрактният клас е клас с чиста виртуална функция. Тази чиста виртуална функция трябва да бъде дефинирана в извлечения клас, ако не, тогава производният клас също се превръща в абстрактен клас. Обектът не може да бъде създаден за абстрактен клас, но може да бъде създаден показалец, който може да бъде насочен към производен клас.

Препоръчителни статии

Това е ръководство за абстрактния клас в C ++. Тук обсъждаме въвеждането в абстрактния клас, както и прилагането на конструктор и деструктор в C ++ заедно с неговия пример. Можете също да разгледате следните статии, за да научите повече-

  1. Абстрактен клас по Python
  2. Абстрактен клас по Java
  3. Конструктор и разрушител в C ++
  4. Повишаване в C ++
  5. По-важно в Java
  6. Топ 11 функции и предимства на C ++