Bevezetés a C ++ absztrakt osztályba

Az osztály a felhasználó által meghatározott adattípus, és rendelkezik saját adatainak és funkcióival. A tagok és a funkciók felhasználhatók egy adott objektum vagy példány létrehozásával. A memóriát csak akkor osztják meg egy osztály számára, amikor egy objektum létrehozásra kerül.

Ha bizonyos viselkedéseket vagy tulajdonságokat akarunk származtatni egyik osztályról a másikra, akkor az öröklés fogalmát használjuk. Ez a módszer néhány tulajdonság öröklésére a szülői osztálytól (alap osztály) a gyermek osztályhoz (származtatott osztály).

Az osztály megvalósításában és az öröklés során, amikor ugyanazokat a funkciókat akarjuk meghatározni mind az alap, mind a származtatott osztályban, a 'virtuális' kulcsszót használjuk az alap osztály függvényével együtt. Ez a „virtuális” funkció meghatározza, hogy ugyanazt a funkciót újradefiniálják vagy felülbírálják a származtatott osztályban.

Az absztrakt osztály egy tiszta virtuális funkcióval rendelkező osztály. Most mi a tiszta virtuális függvény? A tiszta virtuális függvény egy olyan virtuális függvény, amelynek nincs testje, és nullaként van megadva. Ez a típusú funkció akkor kerül megvalósításra, amikor egy funkcióra van szükségünk, de jelenleg nem tudjuk, mi a funkciója. Ezt a funkciót a származtatott osztályban kell megvalósítani vagy meghatározni. Ha nem, akkor a származtatott osztály elvont osztálytá válik.

A tiszta virtuális függvényt a következőképpen definiáljuk:

virtuális void func () = 0;

Példa a C ++ absztrakt osztályra

Itt a C ++ absztrakt osztályának példáját tárgyaljuk részleteivel:

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

Kimenet:

Itt a Sample_Class az alaposztály, a Derived_Class pedig a Sample_Classból származik. A tiszta virtuális függvény, a minta_func (), deklarálódik az alaposztályban. 0-hoz van hozzárendelve, ami azt jelenti, hogy senkinek nincs, és a funkcióban semmi sem történik meg. Így az alaposztály elvont osztálytá vált, mivel tiszta virtuális funkcióval rendelkezik. Kezdetben, amikor a Derived_Class származik az alaposztályból, akkor ez is elvont osztály lesz. De a származtatott osztályban meghatározásra kerül a minta_func () osztály, amely megakadályozza a származtatott osztály elvont osztálytá válását. Amikor a származtatott osztályobjektum létrejön és a függvény meghívásra kerül, akkor a kimenetet úgy nyomtatjuk ki, hogy „tiszta virtuális funkció valósul meg”.

Az absztrakt osztály nem váltható ki, ami azt jelenti, hogy nem hozhatunk létre példányt vagy objektumot egy absztrakt osztály számára. Az objektum nem hozható létre, mert az osztály nincs teljesen megvalósítva. Valójában alapja egy osztálynak, amelyet később teljesen végrehajtanak. De absztrakt osztályra mutatók vagy hivatkozások hozhatók létre. Ez a mutató felhasználható a származtatott osztályfüggvények meghívására. Egy absztrakt osztálynak más adattagjai és funkciói is lehetnek, mint a normál osztály megvalósítása, a tiszta virtuális függvény mellett.

A fenti pont az alábbi program segítségével magyarázható

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

Kimenet:

Itt hibát fogunk kapni, mivel az objektum nem hozható létre az elvont osztályhoz.

Ehelyett a második és a harmadik sor sor valósítható meg, létrehozhat egy mutatót, és felhasználható a származtatott osztályfüggvény hívására.

A fenti függvényben itt az 1. osztály az alaposztály, és mivel tiszta virtuális funkciója (func1), elvont osztálytá vált. A 2. osztály az 1. osztály szülőosztályából származik. A func1 a származtatott osztályban van meghatározva. A fő funkcióban, amikor megpróbálunk létrehozni egy alap osztály típusú objektumot, hibát fogunk kapni, mivel az objektumokat nem lehet absztrakt osztályhoz létrehozni. Míg amikor megpróbálunk létrehozni egy alap osztálytípus mutatót, akkor azt sikeresen létre fogjuk hozni, és a származtatott osztályra mutathatjuk. Ez a mutató felhasználható a származtatott osztályfüggvény hívására.

Az absztrakt osztályoknak lehet konstruktora, amely hasonló a normál osztály megvalósításához. A pusztító esetében tiszta virtuális pusztítót deklarálhatunk. Fontos, hogy egy pusztító törölje az osztály számára kiosztott memóriát. A tiszta virtuális pusztító olyan pusztító, amelyet 0-hoz rendelnek, de ugyanazon osztálynak kell meghatároznia, mivel a pusztítót általában nem felülbírálják.

Példa a kivitelező és a pusztító megvalósítására az Absztrakt osztályra C ++-ban

Itt a C ++ absztrakt osztályának példáját tárgyaljuk részleteivel:

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

Teljesítmény :

Itt, a fenti példában, a Base osztály egy absztrakt osztály, amely a func1 () virtuális függvényt, egy konstruktort és egy tiszta virtuális pusztítót tartalmaz. A tiszta virtuális függvényt a származtatott osztály határozza meg, ily módon megakadályozva, hogy a származtatott osztály absztrakt osztálytá váljon. A tiszta virtuális pusztítót az osztályon kívül az alap osztály határozza meg. Ha meg akarjuk határozni egy osztály tagfunkcióját az osztályon kívül, akkor a hatókör-felbontási operátort kell használni a példa szerint. Létrejön egy alapelv típusú mutató, amely a származtatott osztályra mutat. Ha a pusztítót 'törlés' segítségével hívják, akkor először a származtatott osztály-pusztítót hívják, majd az alap osztály-pusztítót.

Következtetés

Ezért az absztrakt osztályról mindent összeállítva azt mondhatjuk, hogy az absztrakt osztály egy tiszta virtuális funkcióval rendelkező osztály. Ezt a tiszta virtuális függvényt a származtatott osztályban kell meghatározni, ha nem, akkor a származtatott osztály is elvont osztálytá válik. Az objektum nem hozható létre absztrakt osztályhoz, de létrehozható egy mutató, amely a származtatott osztályra mutat.

Ajánlott cikkek

Ez egy útmutató a C ++ absztrakt osztályához. Itt tárgyaljuk az absztrakt osztály bevezetését, valamint a konstruktor és a pusztító megvalósítását a C ++ programban, példájával együtt. A következő cikkeket is megnézheti további információkért -

  1. Absztrakt osztály Pythonban
  2. Absztrakt osztály Java-ban
  3. Konstruktor és pusztító a C ++-ban
  4. A C ++ felülbírálása
  5. A Java alapon érvényes
  6. A C ++ 11 legfontosabb tulajdonságai és előnyei

Kategória: