Uvod v abstraktni razred v C ++

Razred je vrsta podatkov, ki jo določi uporabnik in ima lastne podatkovne člane in funkcije. Člane in funkcije lahko uporabite pri ustvarjanju predmeta ali primerka tega razreda. Pomnilnik se dodeli razredu samo, ko je ustvarjen predmet.

Ko želimo iz enega razreda v drugega izpeljati nekatera vedenja ali značilnosti, uporabimo koncept dedovanja. To je metoda podedovanja nekaj lastnosti od nadrejenega razreda (osnovni razred) do nadrejenega razreda (izpeljani razred).

Pri izvajanju in dedovanju razredov, ko želimo definirati iste funkcije tako v osnovnem kot izpeljanem razredu, uporabimo ključno besedo 'virtualni' skupaj s funkcijo osnovnega razreda. Ta navidezna funkcija določa, da je enaka funkcija na novo definirana ali razveljavljena v izpeljanem razredu.

Abstraktni razred je razred s čisto virtualno funkcijo. Zdaj, kaj je čista virtualna funkcija? Čista navidezna funkcija je virtualna funkcija, ki nima telesa in je dodeljena kot 0. Ta vrsta funkcije se izvaja, kadar potrebujemo funkcijo, vendar trenutno ne vemo, kaj je njena funkcija. To funkcijo je treba izvesti ali definirati v izpeljanem razredu. Če ne, potem tudi izpeljani razred postane abstrakten razred.

Čista virtualna funkcija je opredeljena na naslednji način:

virtual void func () = 0;

Primer abstraktnega razreda v C ++

Tukaj razpravljamo o primeru abstraktnega razreda v C ++ s podrobnostmi:

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

Izhod:

Tu je Sample_Class osnovni razred, Derived_Class pa izhaja iz Sample_Class. Čista virtualna funkcija, imenovana sample_func (), je navedena v osnovnem razredu. Dodeljen je 0, kar pomeni, da nima nikogar in se znotraj funkcije nič ne izvaja. Tako je osnovni razred postal abstrakten razred, saj ima čisto virtualno funkcijo. Na začetku, ko Derived_Class izhaja iz osnovnega razreda, postane tudi abstrakten razred. Toda v izpeljanem razredu je definiran razred sample_func (), ki preprečuje, da izpeljani razred postane abstrakten razred. Ko ustvari izpeljani predmet razreda in pokliče funkcijo, bomo dobili izpis natisnjenega kot „izvedena je čista virtualna funkcija“.

Abstraktnega razreda ni mogoče instancirati, kar pomeni, da ne moremo ustvariti primerka ali predmeta za abstraktni razred. Objekta ni mogoče ustvariti, ker razred ni izveden v celoti. Pravzaprav je osnova za razred, ki se kasneje v celoti izvaja. Toda kazalniki ali reference se lahko ustvarijo za abstraktni razred. Ta kazalec lahko uporabite za klicanje izpeljanih funkcij razreda. Abstraktni razred ima lahko druge člane podatkov in funkcije, podobne običajni izvedbi razreda, skupaj s čisto virtualno funkcijo.

Zgornjo točko lahko razložite s spodnjim programom

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

Izhod:

Tu bomo dobili napako, saj predmeta ni mogoče ustvariti za abstraktni razred.

Namesto tega se lahko izvedeta 2. in 3. vrstica kode, lahko se ustvari kazalec in se lahko uporabi za klic izpeljane funkcije razreda.

Tu je v zgornji funkciji Class1 osnovni razred in ker ima čisto virtualno funkcijo (func1), je postal abstrakten razred. Class2 izhaja iz nadrejenega razreda Class1. Func1 je opredeljen v izpeljanem razredu. V glavni funkciji bomo pri poskusu izdelave predmeta osnovnega razreda dobili napako, saj predmetov ni mogoče ustvariti za abstraktni razred. Medtem ko bomo poskušali ustvariti kazalec vrste osnovnega razreda, bo ta uspešno ustvarjen in ga lahko usmerimo v izpeljani razred. Ta kazalec lahko uporabite za klic izpeljane funkcije razreda.

Abstraktni razred ima konstruktor podoben običajni izvedbi razreda. V primeru destruktorja lahko izjavimo čisti virtualni destruktor. Za brisanje pomnilnika, dodeljenega za razred, je pomembno destruktor. Čisti navidezni destruktor je destruktor, ki mu je dodeljen 0, vendar ga mora definirati isti razred, saj destruktor običajno ni razveljavljen.

Primer izvedbe konstruktorja in destruktorja za abstraktni razred v C ++

Tukaj razpravljamo o primeru abstraktnega razreda v C ++ s podrobnostmi:

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

Izhod :

Tu je v zgornjem primeru razred Base abstrakten razred s čisto virtualno funkcijo func1 (), konstruktorjem in čistim virtualnim destruktorjem. Čista navidezna funkcija je definirana v izpeljanem razredu, kar preprečuje, da bi izpeljani razred postal abstrakten razred. Čisti navidezni destruktor določa razred Base zunaj razreda. Če želimo določiti funkcijo člana nekega razreda, je treba uporabiti operater ločljivosti obsega, kot je prikazano v primeru. Ustvari se kazalec tipa osnovnega razreda in usmeri v izpeljani razred. Kadar se destruktor pokliče s pomočjo 'delete', se najprej pokliče destruktor izpeljanega razreda, nato pa se pokliči uničevalec osnovnega razreda.

Sklep

Torej, če sestavimo vse o abstraktnem razredu, lahko rečemo, da je abstraktni razred razred s čisto virtualno funkcijo. Ta čista virtualna funkcija mora biti definirana v izpeljanem razredu, če ne, pa tudi izpeljani razred postane abstrakten razred. Objekta ni mogoče ustvariti za abstraktni razred, ampak lahko ustvarite kazalec, ki ga lahko kaže na izpeljani razred.

Priporočeni članki

To je vodnik za abstraktni razred v C ++. Tukaj razpravljamo o uvodu v abstraktni razred, kot tudi o izvajanju konstruktorja in destruktorja v C ++ in njegovem primeru. Če želite izvedeti več, si oglejte tudi naslednje članke -

  1. Izvleček razreda Python
  2. Izvleček razreda Java
  3. Konstruktor in destruktor v C ++
  4. Prevlado v C ++
  5. Prevladovanje v Javi
  6. 11 najboljših lastnosti in prednosti C ++