Virtualni destruktor u C++

Virtualni Destruktor U C



C++ je jezik koji se koristi za pružanje temelja osnovnom konceptu programiranja i čini logičko razmišljanje programera snažnim. U C++-u OOP igra vitalnu ulogu jer je OOP objektno orijentirani jezik koji stvara objekte klasa. U OOP-u proučavamo klase i objekte. Klase sadrže podatkovne članove koji su varijable različitih tipova i različitih funkcija članova. Uz pomoć instanci pristupamo podacima bilo koje klase. Svaka klasa ima svoj konstruktor i destruktor kada kreirate klasu. Konstruktor se sam poziva kada se kreira objekt te klase. Također možemo inicijalizirati varijable klase unutar konstruktora. Destruktori se također automatski stvaraju s konstruktorom, ali destruktori uništavaju objekt i to je zadnja funkcija koja se poziva prije uništavanja objekta. Kreira se naziv klase, na primjer klasa “Profession”. Njegov konstruktor je Profession(), a destruktor je ~Profession (). Njih troje imaju isto ime.

Nakon razgovora o OOP-u, konstruktorima i destruktorima, razgovarajmo sada o virtualnim destruktorima. Virtualni destruktori, kao što naziv navodi, uništavaju objekt. Imamo osnovnu klasu i izvedenu klasu koja je izvedena iz osnovne klase. Obje klase imaju svoje konstruktore i destruktore. Virtualni destruktor oslobađa reminiscencije koje su dodijeljene kroz objekt izvedene klase dok briše objekte izvedene klase pomoću pokazivača osnovne klase s ključnom riječi 'virtualno'.

Zašto koristimo Virtual Destructor?

Kada je izvršenje funkcija člana klase gotovo ili je izvršenje metode main() pri kraju, destruktor se automatski poziva da oslobodi memoriju koja je alocirana tijekom stvaranja objekta. Sada, zašto koristimo virtualni destruktor? Kada se izbriše osnovna klasa koja pokazuje na izvedenu klasu, ovdje se koristi pokazivač (*). Destruktor osnovne klase poziva se samo tijekom ovog procesa. Destruktor izvedene klase se ne poziva što dovodi do problema. Jedan od njih je problem curenja memorije. Kako bismo izbjegli ovaj problem i učinili naš kod sigurnim, virtualno uništavamo objekte kako bismo oslobodili memorijski prostor koji je bio dodijeljen tijekom stvaranja objekata brisanjem destruktora osnovne klase.

C++ osnovni primjer bez virtualnog destruktora

Pogledajmo kako program funkcionira bez virtualnog destruktora s jednostavnim programom koji briše pokazivač.

Kodirati:

#include

koristeći prostor imena std ;
klasa Roditeljska_klasa0
{
javnost :
Roditeljska_klasa0 ( )
{ cout << 'Konstruktor roditeljske klase' << endl ; }
~Nadređena_klasa0 ( )
{ cout << 'Destruktor roditeljske klase' << endl ; }
} ;
razred Dijete_1 : javna roditeljska_klasa0
{
javnost :
Dijete_1 ( )
{ cout << 'Konstruktor podređene klase' << endl ; }
~Dijete_1 ( )
{ cout << 'Destruktor podređenih klasa' << endl ; }
} ;
int glavni ( )
{
Roditeljska_klasa0 * pokazivač = novo Dijete_1 ( ) ;
brisanje pokazivača ;
povratak 0 ;
}

Ovaj kod objašnjava kako se kod izvršava bez virtualnog destruktora. Prije svega, stvorite klasu pod nazivom “Parent_Class0” koja će biti roditeljska klasa. Unutar ove klase kreirajte konstruktor i destruktor. Kao što znamo, konstruktor i destruktor se zovu isto kao i klasa. Destruktor je predstavljen slično kao konstruktor, ali ima simbol (~) koji ga razlikuje od konstruktora. Unutar konstruktora i destruktora ispišite poruku koristeći “cout<<”. Sada stvorite drugu klasu koja je “Child_1”. Ova klasa je izvedena iz nadređene klase, “Parent_Class0”. Izvedena klasa ima svoj konstruktor i destruktor koji sadrže poruku za ispis na izlaznom ekranu.

U metodi main() stvaramo instancu 'Parent_Class0' i dodjeljujemo joj izvedenu klasu. Ključna točka koju treba zapamtiti u ovom slučaju je da koristimo pokazivač za dohvaćanje roditeljske klase. Kada uđe u roditeljsku klasu, izvršava konstruktor roditeljske klase. Zatim ide u klasu dijete i izvršava svoj konstruktor. Prije izvršenja destruktora podređene klase, mora se izvršiti destruktor roditeljske klase. Prevodilac izvršava destruktor roditeljske klase i prekida klasu bez izvršavanja destruktora podređene klase. To je problem; ne oslobađa sjećanje na djetetov razred. Predstavlja konstruktora roditeljske klase, konstruktora podređene klase i destruktora roditeljske klase. To pokazuje da se destruktor klase djeteta ne izvršava. Nakon ovog izvođenja, brišemo pokazivač u funkciji main().

Izlaz:

C++ primjer s virtualnim destruktorom

Raspravljajmo o virtualnom destruktoru s jednostavnim kodom kako bismo razlikovali kako radi s virtualnim destruktorom i bez njega.

Kodirati:

#include

koristeći prostor imena std ;
klasa Roditeljska_klasa0
{
javnost :
Roditeljska_klasa0 ( )
{ cout << 'Konstruktor roditeljske klase' << endl ; }
virtualna ~Parent_Class0 ( )
{ cout << 'Destruktor roditeljske klase' << endl ; }
} ;
razred Dijete_1 : javna roditeljska_klasa0
{
javnost :
Dijete_1 ( )
{ cout << 'Konstruktor podređene klase' << endl ; }
virtualno ~Dijete_1 ( )
{ cout << 'Destruktor podređenih klasa' << endl ; }
} ;
int glavni ( )
{
Roditeljska_klasa0 * pokazivač = novo Dijete_1 ( ) ;
brisanje pokazivača ;
povratak 0 ;
}

Prvi program objasnio je problem s kojim se suočavamo bez virtualnog destruktora. Sada, ovaj kod će riješiti taj problem pomoću virtualnog destruktora. Prvo kopirajte prvi kod i samo dodajte jednu ključnu riječ na dva mjesta u ovom programu. Ta riječ je 'virtualno'. Umetnite ovu riječ s destruktorom nadređene klase, “Parent_Class0”. Slično, spomenite ovo s destruktorom klase djeteta koji je 'Child_1' koji je izveden iz klase roditelja. Ova 'virtualna' ključna riječ čini malu promjenu i prvo izvršava destruktor podređene klase 'Child_1'. Zatim izvršava destruktor nadređene klase, “Parent_Class0”. Ostatak programa radi isto kao i bez virtualnog destruktora. Dodavanjem ovog malog dijela koda, možemo spasiti našu memoriju od curenja. Sada prikazuje četiri poruke na konzoli. Prvo, konstruktor nadređene klase, zatim konstruktor podređene klase, destruktor podređene klase i destruktor nadređene klase. Na kraju brišemo pokazivač unutar main() metode.

Izlaz:

C++ primjer čistog virtualnog destruktora

U ovom kodu govorit ćemo o čistom virtualnom destruktoru, kako funkcionira i po čemu se razlikuje od virtualnog destruktora.

Kodirati:

#include

klasa Roditelj_0 {
javnost :
virtualni ~Roditelj_0 ( ) = 0 ;
} ;
Roditelj_0 :: ~Roditelj_0 ( )
{
std :: cout << 'Zdravo, ja sam Pure Destructor. Zvali ste me!' ;
}
razred Dijete_0 : javni roditelj_0 {
javnost :
~Dijete_0 ( ) { std :: cout << 'Izvedeni destruktor je ovdje \n ' ; }
} ;

int glavni ( )
{
Roditelj_0 * ptr_0 = novo Dijete_0 ( ) ;
brisanje ptr_0 ;
povratak 0 ;
}

Nadređena klasa “Parent_0” kreirana je u prvom koraku koda. Unutar njega kreirajte virtualni roditeljski destruktor i dodijelite mu 0. Ovo postavlja virtualni destruktor na čisti virtualni destruktor što znači da je roditeljska klasa sada apstraktna i ne možemo kreirati instance ove klase. Izvan nadređene klase “Parent_0”, definirajte destruktore i std::cout. Traženi tekst prikazan je korištenjem std::cout. Zatim izvedite klasu “Child_0” iz roditeljske klase i definirajte njen destruktor. Unutar destruktora ispišite poruku. U funkciji main() kreirajte pokazivač nadređene klase i dodijelite joj podređenu klasu.

Kompajler ide u nadređenu klasu “Parent_0”. Kada se pokazivač kreira, automatski se poziva njegov konstruktor. Zatim, prevodilac odlazi u klasu dijete da pozove njen konstruktor. Nakon uspješnog izvođenja konstruktora, on izvršava destruktor podređene klase “Child_0”. Zatim izvršava destruktor nadređene klase. Na ovaj način možemo napraviti čisti virtualni destruktor. Ne potiče se na njezino korištenje jer primjenom ove metode roditeljska klasa postaje apstraktna što je čini beskorisnom. Metodologija koja se najviše koristi je virtualni destruktor i to je dobra praksa.

Izlaz:

Zaključak

Učili smo o virtualnom destruktoru počevši od koncepta OOP-a pa sve do konstruktora i destruktora. Nakon što smo sve ovo objasnili, detaljno smo razgovarali o virtualnom destruktoru s primjerima kodiranja i čistom virtualnom destruktoru. Prije nego objasnimo virtualni destruktor, moramo znati o konstruktorima, destruktorima i nasljeđivanju. Kod nasljeđivanja, nasljeđujemo klase od nadređene klase. Podređene klase mogu biti više od jedne, ali roditeljska klasa je samo jedna. Virtualni destruktori i čisti virtualni destruktori primjenjuju se u nasljeđivanju radi zaštite od curenja memorije. Od osnovnog primjera do naprednog primjera, pokrili smo sve što biste trebali znati da biste počeli koristiti i doslovno uništiti pamćenje izvedene klase.