Virtuálny deštruktor v C++

Virtualny Destruktor V C



C++ je jazyk, ktorý sa používa ako základ v základnom koncepte programovania a posilňuje logické myslenie programátorov. V C++ hrá OOP zásadnú úlohu, pretože OOP je objektovo orientovaný jazyk, ktorý vytvára objekty tried. V OOP študujeme triedy a objekty. Triedy obsahujú dátové členy, ktoré sú premennými rôznych typov a rôznych členských funkcií. Pomocou inštancií pristupujeme k údajom akejkoľvek triedy. Každá trieda má pri vytváraní triedy svoj konštruktor a deštruktor. Konštruktor sa volá sám seba, keď je vytvorený objekt tejto triedy. Môžeme tiež inicializovať premenné triedy vo vnútri konštruktora. Deštruktory sa tiež automaticky vytvárajú pomocou konštruktora, ale deštruktory zničia objekt a je to posledná funkcia, ktorá sa volá pred zničením objektu. Vytvorí sa názov triedy, napríklad trieda „Profesia“. Jeho konštruktorom je Profesia () a deštruktorom ~ Profesia (). Všetci traja majú rovnaké meno.

Po rozhovore o OOP, konštruktoroch a deštruktoroch sa teraz bavme o virtuálnych deštruktoroch. Virtuálne deštruktory, ako uvádza názov, zničia objekt. Máme základnú triedu a odvodenú triedu, ktorá je odvodená od základnej triedy. Obe triedy majú svojich konštruktérov a deštruktorov. Virtuálny deštruktor uvoľňuje reminiscencie, ktoré sú prideľované prostredníctvom objektu odvodenej triedy, pričom odstraňuje objekty odvodenej triedy pomocou ukazovateľa základnej triedy s kľúčovým slovom „virtual“.

Prečo používame virtuálny deštruktor?

Keď sa vykoná vykonávanie funkcií členov triedy alebo sa má skončiť vykonávanie metódy main(), automaticky sa zavolá deštruktor, aby uvoľnil pamäť, ktorá je pridelená počas vytvárania objektu. Prečo teraz používame virtuálny deštruktor? Keď sa odstráni základná trieda, ktorá ukazuje na odvodenú triedu, použije sa tu ukazovateľ (*). Deštruktor základnej triedy sa volá iba počas tohto procesu. Deštruktor odvodenej triedy sa nevolá, čo vedie k problémom. Jedným z nich je problém s únikom pamäte. Aby sme predišli tomuto problému a zabezpečili náš kód, virtuálne zničíme objekty, aby sme uvoľnili pamäťový priestor, ktorý bol pridelený počas vytvárania objektov, odstránením deštruktora základnej triedy.

Základný príklad C++ bez virtuálneho deštruktora

Pozrime sa, ako program funguje bez virtuálneho deštruktora s jednoduchým programom, ktorý vymaže ukazovateľ.

kód:

#include

pomocou menného priestoru std ;
trieda Parent_Class0
{
verejnosti :
Parent_Class0 ( )
{ cout << 'Konštruktor rodičovskej triedy' << endl ; }
~Rodičovská_trieda0 ( )
{ cout << 'Deštruktor rodičovskej triedy' << endl ; }
} ;
trieda Dieťa_1 : verejná Parent_Class0
{
verejnosti :
Dieťa_1 ( )
{ cout << 'Konštruktér detskej triedy' << endl ; }
~Child_1 ( )
{ cout << 'deštruktor detskej triedy' << endl ; }
} ;
int hlavné ( )
{
Parent_Class0 * ukazovateľ = nové dieťa_1 ( ) ;
vymazať ukazovateľ ;
vrátiť 0 ;
}

Tento kód vysvetľuje, ako sa kód spúšťa bez virtuálneho deštruktora. Najprv vytvorte triedu s názvom „Parent_Class0“, ktorá bude rodičovskou triedou. V tejto triede vytvorte konštruktor a deštruktor. Ako vieme, konštruktor a deštruktor sú pomenované rovnako ako trieda. Deštruktor je reprezentovaný podobne ako konštruktor, ale má symbol (~), ktorý ho odlišuje od konštruktora. Vo vnútri konštruktora a deštruktora vytlačte správu pomocou „cout<<“. Teraz vytvorte ďalšiu triedu, ktorá je „Child_1“. Táto trieda je odvodená od nadradenej triedy „Parent_Class0“. Odvodená trieda má svoj konštruktor a deštruktor, ktoré obsahujú správu, ktorá sa má vytlačiť na výstupnej obrazovke.

V metóde main() vytvoríme inštanciu triedy „Parent_Class0“ a priradíme jej odvodenú triedu. Rozhodujúcim bodom, ktorý si v tomto prípade treba zapamätať, je, že na získanie nadradenej triedy používame ukazovateľ. Keď ide do nadradenej triedy, spustí konštruktor nadradenej triedy. Potom prejde do podradenej triedy a vykoná jej konštruktor. Pred spustením deštruktora podradenej triedy musí vykonať deštruktor nadradenej triedy. Kompilátor spustí deštruktor nadradenej triedy a ukončí triedu bez spustenia deštruktora podradenej triedy. To je ten problém; neoslobodzuje pamäť triedy dieťaťa. Predstavuje konštruktor nadradenej triedy, konštruktor podradenej triedy a deštruktor nadradenej triedy. To ukazuje, že deštruktor podradenej triedy nie je vykonaný. Po tomto vykonaní vymažeme ukazovateľ vo funkcii main().

Výkon:

Príklad C++ s virtuálnym deštruktorom

Poďme diskutovať o virtuálnom deštruktore pomocou jednoduchého kódu, aby sme rozlíšili, ako funguje s virtuálnym deštruktorom a bez neho.

kód:

#include

pomocou menného priestoru std ;
trieda Parent_Class0
{
verejnosti :
Parent_Class0 ( )
{ cout << 'Konštruktor rodičovskej triedy' << endl ; }
virtuálna ~Parent_Class0 ( )
{ cout << 'Deštruktor rodičovskej triedy' << endl ; }
} ;
trieda Dieťa_1 : verejná Parent_Class0
{
verejnosti :
Dieťa_1 ( )
{ cout << 'Konštruktér detskej triedy' << endl ; }
virtuálne ~Child_1 ( )
{ cout << 'deštruktor detskej triedy' << endl ; }
} ;
int hlavné ( )
{
Parent_Class0 * ukazovateľ = nové dieťa_1 ( ) ;
vymazať ukazovateľ ;
vrátiť 0 ;
}

Prvý program vysvetlil problém, ktorému čelíme bez virtuálneho deštruktora. Teraz tento kód vyrieši tento problém pomocou virtuálneho deštruktora. Najprv skopírujte prvý kód a jednoducho pridajte jedno kľúčové slovo na dve miesta v tomto programe. To slovo je „virtuálne“. Vložte toto slovo pomocou deštruktora nadradenej triedy „Parent_Class0“. Podobne to uveďte s deštruktorom podradenej triedy, ktorým je „Child_1“, ktorý je odvodený od nadradenej triedy. Toto „virtuálne“ kľúčové slovo urobí malú zmenu a najskôr spustí deštruktor podradenej triedy „Child_1“. Potom spustí deštruktor nadradenej triedy „Parent_Class0“. Zvyšok programu funguje rovnako ako bez virtuálneho deštruktora. Pridaním tohto malého kúsku kódu môžeme zachrániť našu pamäť pred únikom. Teraz na konzole zobrazuje štyri správy. Najprv konštruktor nadradenej triedy, potom konštruktor podradenej triedy, deštruktor podradenej triedy a deštruktor nadradenej triedy. Nakoniec vymažeme ukazovateľ v rámci metódy main().

Výkon:

Príklad C++ čistého virtuálneho deštruktora

V tomto kóde budeme hovoriť o čistom virtuálnom deštruktore, ako funguje a ako sa líši od virtuálneho deštruktora.

kód:

#include

trieda Rodič_0 {
verejnosti :
virtuálny ~Rodič_0 ( ) = 0 ;
} ;
Parent_0 :: ~Parent_0 ( )
{
std :: cout << 'Ahoj, som Pure Destructor. Volal si ma!' ;
}
trieda Dieťa_0 : verejný rodič_0 {
verejnosti :
~Child_0 ( ) { std :: cout << „Odvodený deštruktor je tu \n ' ; }
} ;

int hlavné ( )
{
Parent_0 * ptr_0 = nové Dieťa_0 ( ) ;
odstrániť ptr_0 ;
vrátiť 0 ;
}

Nadradená trieda „Parent_0“ sa vytvorí v prvom kroku kódu. Vo vnútri vytvorte virtuálny rodičovský deštruktor a priraďte mu 0. Tým sa virtuálny deštruktor nastaví na čistý virtuálny deštruktor, čo znamená, že rodičovská trieda je teraz abstraktná a nemôžeme vytvárať inštancie tejto triedy. Mimo nadradenej triedy „Parent_0“ definujte deštruktory a std::cout. Požadovaný text sa zobrazí pomocou std::cout. Potom odvodite triedu „Child_0“ z nadradenej triedy a definujte jej deštruktor. Vo vnútri deštruktora vytlačte správu. Vo funkcii main() vytvorte ukazovateľ nadradenej triedy a priraďte mu podradenú triedu.

Kompilátor prejde do nadradenej triedy „Parent_0“. Po vytvorení ukazovateľa sa automaticky zavolá jeho konštruktor. Potom kompilátor prejde do podradenej triedy, aby vyvolal jej konštruktor. Po úspešnom vykonaní konštruktora vykoná deštruktor podradenej triedy „Child_0“. Potom vykoná deštruktor nadradenej triedy. Týmto spôsobom môžeme vytvoriť čistý virtuálny deštruktor. Neodporúča sa používať ju, pretože použitím tejto metódy sa rodičovská trieda stáva abstraktnou, čo ju robí zbytočnou. Najviac používaná metodológia je virtuálny deštruktor a je to dobrá prax.

Výkon:

Záver

Dozvedeli sme sa o virtuálnom deštruktore od konceptu OOP až po prechod ku konštruktorom a deštruktorom. Po vysvetlení tohto všetkého sme podrobne diskutovali o virtuálnom deštruktore s príkladmi kódovania a čistým virtuálnym deštruktorom. Pred vysvetlením virtuálneho deštruktora musíme vedieť o konštruktoroch, deštruktoroch a dedičnosti. Pri dedení zdedíme triedy od rodičovskej triedy. Podradených tried môže byť viac ako jedna, ale rodičovská trieda je len jedna. Virtuálne deštruktory a čisté virtuálne deštruktory sa používajú v dedičnosti, aby sa zabránilo úniku pamäte. Od základného príkladu po pokročilý príklad sme pokryli všetko, čo by ste mali vedieť, aby ste mohli začať používať a virtuálne zničiť pamäť odvodenej triedy.