Úvod do abstraktnej triedy v C ++

Trieda je dátový typ definovaný používateľom a má svoje vlastné dátové členy a funkcie. Členovia a funkcie môžu byť použité vytvorením objektu alebo inštancie tejto triedy. Pamäť je vyhradená pre triedu, len keď je vytvorený objekt.

Keď chceme odvodiť určité správanie alebo charakteristiky z jednej triedy do druhej triedy, používame koncept dedičnosti. Toto je metóda zdedenia niekoľkých vlastností z rodičovskej triedy (základnej triedy) do podradenej triedy (odvodená trieda).

Pri implementácii a dedení triedy, keď chceme definovať rovnaké funkcie v základnej aj odvodenej triede, spolu s funkciou základnej triedy používame kľúčové slovo „virtual“. Táto „virtuálna“ funkcia určuje, že rovnaká funkcia je v odvodenej triede predefinovaná alebo prepísaná.

Abstraktná trieda je trieda s čisto virtuálnou funkciou. Čo je to čisto virtuálna funkcia? Čistá virtuálna funkcia je virtuálna funkcia, ktorá nemá telo a je priradená ako 0. Tento typ funkcie sa implementuje, keď potrebujeme funkciu, ale momentálne nevieme, čo je jej funkcia. Táto funkcia musí byť implementovaná alebo definovaná v odvodenej triede. Ak nie, odvodená trieda sa tiež stane abstraktnou triedou.

Čistá virtuálna funkcia je definovaná takto:

func () = 0;

Príklad abstraktnej triedy v C ++

Tu diskutujeme o príklade abstraktnej triedy v C ++ s podrobnosťami:

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

Výkon:

Tu je Sample_Class základná trieda a Derived_Class je odvodená od Sample_Class. V základnej triede je deklarovaná čisto virtuálna funkcia s názvom sample_func (). Je priradená k 0, čo znamená, že nemá nikoho a vo funkcii nie je implementované nič. Základná trieda sa tak stala abstraktnou triedou, pretože má čisto virtuálnu funkciu. Spočiatku, keď je Derived_Class odvodená od základnej triedy, stáva sa tiež abstraktnou triedou. Ale v odvodenej triede je definovaná trieda sample_func (), ktorá zabraňuje tomu, aby sa odvodená trieda stala abstraktnou triedou. Po vytvorení odvodeného objektu triedy a vyvolaní funkcie sa výstup vytlačí ako implementácia čistej virtuálnej funkcie.

Abstraktnú triedu nemožno vytvoriť, čo znamená, že nemôžeme vytvoriť inštanciu alebo objekt pre abstraktnú triedu. Objekt nie je možné vytvoriť, pretože trieda nie je implementovaná úplne. Je to vlastne základ pre triedu, ktorá je implementovaná úplne neskôr. Ukazovatele alebo odkazy však môžu byť vytvorené pre abstraktnú triedu. Tento ukazovateľ sa dá použiť na volanie odvodených funkcií triedy. Abstraktná trieda môže mať ďalšie dátové členy a funkcie podobné implementácii normálnej triedy spolu s čisto virtuálnou funkciou.

Vyššie uvedený bod možno vysvetliť pomocou nižšie uvedeného programu

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

Výkon:

Tu dostaneme chybu, pretože objekt nie je možné vytvoriť pre abstraktnú triedu.

Namiesto toho sa môže implementovať druhý a tretí riadok kódu, môže sa vytvoriť ukazovateľ a môže sa použiť na volanie odvodenej funkcie triedy.

Vo vyššie uvedenej funkcii Class1 je základná trieda a keďže má čistú virtuálnu funkciu (func1), stala sa abstraktnou triedou. Trieda 2 je odvodená od materskej triedy Trieda1. Func1 je definovaný v odvodenej triede. V hlavnej funkcii sa pri pokuse o vytvorenie objektu typu základnej triedy zobrazí chyba, pretože objekty nemožno vytvoriť pre abstraktnú triedu. Zatiaľ čo keď sa snažíme vytvoriť ukazovateľ typu základnej triedy, bude vytvorený úspešne a môžeme ho nasmerovať na odvodenú triedu. Tento ukazovateľ sa dá použiť na volanie odvodenej funkcie triedy.

Abstraktná trieda môže mať konštruktor podobný implementácii normálnej triedy. V prípade deštruktora môžeme deklarovať čisto virtuálneho deštruktora. Je dôležité mať deštruktor, aby sa vymazala pamäť vyhradená pre triedu. Čistý virtuálny deštruktor je deštruktor, ktorý je priradený k 0, ale musí byť definovaný rovnakou triedou, pretože deštruktor sa zvyčajne neprepíše.

Príklad implementácie konštruktora a deštruktora pre abstraktnú triedu v C ++

Tu diskutujeme o príklade abstraktnej triedy v C ++ s podrobnosťami:

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

Výstup :

V uvedenom príklade je základná trieda abstraktná trieda s čisto virtuálnou funkčnou funkciou func1 (), konštruktor a čisto virtuálny deštruktor. Čistá virtuálna funkcia je definovaná v odvodenej triede, čím bráni odvodenej triede stať sa abstraktnou triedou. Čistý virtuálny deštruktor je definovaný triedou Base mimo triedy. Ak chceme definovať členskú funkciu triedy mimo triedy, mal by sa použiť operátor rozlíšenia rozsahu, ako je uvedené v príklade. Vytvorí sa ukazovateľ typu základnej triedy a odkazuje na odvodenú triedu. Keď sa deštruktor nazýva pomocou 'vymazať', najskôr sa nazýva deštruktor odvodenej triedy a potom sa nazýva deštruktor základnej triedy.

záver

Preto, aby sme mohli zostaviť všetko o abstraktnej triede, môžeme povedať, že abstraktná trieda je trieda s čisto virtuálnou funkciou. Táto čisto virtuálna funkcia musí byť definovaná v odvodenej triede, ak nie, potom sa odvodená trieda tiež stane abstraktnou triedou. Objekt nie je možné vytvoriť pre abstraktnú triedu, ale je možné vytvoriť ukazovateľ, ktorý môže byť nasmerovaný na odvodenú triedu.

Odporúčané články

Toto je sprievodca abstraktnou triedou v C ++. Tu diskutujeme úvod do abstraktnej triedy, ako aj implementáciu konštruktora a deštruktora v C ++ spolu s jeho príkladom. Viac informácií nájdete aj v nasledujúcich článkoch

  1. Abstraktná trieda v Pythone
  2. Abstraktná trieda v Jave
  3. Konštruktor a ničiteľ v C ++
  4. Prevažujúce v C ++
  5. Prevláda v Jave
  6. Prvých 11 funkcií a výhod C ++

Kategórie: