Introduktion til abstrakt klasse i C ++

En klasse er en datatype, der er defineret af brugeren, og den har sine egne datamedlemmer og funktioner. Medlemmerne og funktionerne kan bruges ved at oprette et objekt eller et eksempel på den klasse. Hukommelse tildeles kun til en klasse, når der oprettes et objekt.

Når vi ønsker at udlede nogle adfærd eller egenskaber fra en klasse til en anden klasse, bruger vi begrebet arv. Dette er metoden til at arve få egenskaber fra forældreklasse (baseklasse) til barneklasse (afledt klasse).

Når vi ønsker at definere de samme funktioner både i basen og afledt klasse, bruger vi nøgleordet 'virtuel' sammen med baseklassefunktionen i klassimplementering og arv. Denne 'virtuelle' funktion specificerer, at den samme funktion omdefineres eller tilsidesættes i den afledte klasse.

En abstrakt klasse er en klasse med ren virtuel funktion. Hvad er nu en ren virtuel funktion? En ren virtuel funktion er en virtuel funktion, der ikke har noget organ og er tildelt som 0. Denne type funktion implementeres, når vi har brug for en funktion, men vi ved ikke i øjeblikket, hvad dens funktion er. Denne funktion skal implementeres eller defineres i den afledte klasse. Hvis ikke, bliver den afledte klasse også en abstrakt klasse.

En ren virtuel funktion er defineret som følger:

virtual void func () = 0;

Eksempel på abstrakt klasse i C ++

Her diskuterer vi Eksempel på abstrakt klasse i C ++ med detaljer:

#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();
)

Produktion:

Her er Sample_Class baseklassen, og Derived_Class er afledt fra Sample_Class. En ren virtuel funktion kaldet sample_func () deklareres i baseklassen. Det er tildelt 0, hvilket betyder, at det ikke har nogen, og at der ikke implementeres noget inde i funktionen. Baseklassen er således blevet en abstrakt klasse, da den har en ren virtuel funktion. Oprindeligt, når Derived_Class er afledt fra baseklassen, bliver det også en abstrakt klasse. Men i den afledte klasse defineres klassen sample_func (), hvilket forhindrer, at den afledte klasse bliver en abstrakt klasse. Når det afledte klasseobjekt oprettes og funktion kaldes, får vi output udskrevet som 'ren virtuel funktion er implementeret'.

En abstrakt klasse kan ikke instantieres, hvilket betyder, at vi ikke kan oprette en instans eller et objekt til en abstrakt klasse. Objektet kan ikke oprettes, fordi klassen ikke er implementeret fuldt ud. Det er faktisk en base for en klasse, der implementeres fuldt ud senere. Men der kan oprettes pointer eller referencer til en abstrakt klasse. Denne markør kan bruges til at kalde de afledte klassefunktioner. En abstrakt klasse kan have andre datamedlemmer og funktioner, der ligner normal klasseimplementering sammen med en ren virtuel funktion.

Ovenstående punkt kan forklares gennem nedenstående program

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();
)

Produktion:

Her får vi en fejl, da et objekt ikke kan oprettes til abstrakt klasse.

I stedet kan 2. og 3. kodelinie implementeres, en markør kan oprettes og kan bruges til at kalde afledt klassefunktion.

I ovennævnte funktion er Class1 baseklassen, og da den har en ren virtuel funktion (func1) er den blevet en abstrakt klasse. Klasse2 er afledt af moderklassen Class1. Func1 er defineret i den afledte klasse. Når vi prøver at oprette et objekt af typen baseklasse i hovedfunktionen, får vi en fejl, da objekter ikke kan oprettes til abstrakt klasse. Mens vi prøver at oprette en markør af basetypetypen, oprettes den med succes, og vi kan pege den til den afledte klasse. Denne markør kan bruges til at kalde den afledte klassefunktion.

En abstrakt klasse kan have konstruktører, der ligner normal klasseimplementering. I tilfælde af destruktoren kan vi erklære en ren virtuel destruktør. Det er vigtigt at have en destruktor for at slette den hukommelse, der er tildelt til klassen. Ren virtuel destructor er en destruktor, der er tildelt 0, men den skal defineres af samme klasse, da destruktor normalt ikke tilsidesættes.

Eksempel på implementering af konstruktør og destruktor til Abstract Class i C ++

Her diskuterer vi Eksempel på abstrakt klasse i C ++ med detaljer:

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;
)

Output :

I ovenstående eksempel er baseklassen en abstrakt klasse med ren virtuel funktion func1 (), en konstruktør og en ren virtuel destruktor. Den rene virtuelle funktion er defineret i den afledte klasse, hvilket forhindrer, at den afledte klasse bliver en abstrakt klasse. Den rene virtuelle destruktor defineres af Base-klassen uden for klassen. Hvis vi ønsker at definere medlemsfunktionen for en klasse uden for klassen, skal operatøren for omfangsopløsning bruges som vist i eksemplet. Der oprettes en markør af basisklasse og peger på den afledte klasse. Når destruktor kaldes ved hjælp af 'slet', kaldes først den afledte klassedestruktør og derefter kaldes destruktøren af ​​baseklassen.

Konklusion

For at samle alt om en abstrakt klasse kan vi derfor sige, at den abstrakte klasse er en klasse med en ren virtuel funktion. Denne rene virtuelle funktion skal defineres i den afledte klasse, hvis ikke, bliver den afledte klasse også en abstrakt klasse. Objektet kan ikke oprettes til abstrakt klasse, men der kan oprettes en markør, der kan peges på den afledte klasse.

Anbefalede artikler

Dette er en guide til Abstract Class i C ++. Her diskuterer vi introduktionen til abstrakt klasse samt implementering af konstruktør og destruktor i C ++ sammen med dets eksempel. Du kan også se på de følgende artikler for at lære mere-

  1. Abstrakt klasse i Python
  2. Abstrakt klasse i Java
  3. Konstruktør og Destructor i C ++
  4. Overskydende i C ++
  5. Overstyring i Java
  6. Top 11 funktioner og fordele ved C ++

Kategori: