Virtualni destruktor v C++

Virtualni Destruktor V C



C++ je jezik, ki se uporablja za utemeljitev osnovnega koncepta programiranja in krepi logično razmišljanje programerjev. V C++ ima OOP ključno vlogo, saj je OOP objektno usmerjen jezik, ki ustvarja objekte razredov. V OOP preučujemo razrede in objekte. Razredi vsebujejo podatkovne člane, ki so spremenljivke različnih tipov in različne članske funkcije. S pomočjo instanc dostopamo do podatkov poljubnega razreda. Vsak razred ima svoj konstruktor in destruktor, ko ustvarite razred. Ko je objekt tega razreda ustvarjen, se prikliče sam konstruktor. Spremenljivke razreda lahko inicializiramo tudi znotraj konstruktorja. Destruktorji so tudi samodejno ustvarjeni s konstruktorjem, vendar destruktorji uničijo objekt in je zadnja funkcija, ki se kliče pred uničenjem objekta. Ustvari se ime razreda, na primer razred »Poklic«. Njegov konstruktor je Profession(), destruktor pa ~Profession (). Vsi trije imajo isto ime.

Po pogovoru o OOP, konstruktorjih in destruktorjih, se zdaj pogovorimo o virtualnih destruktorjih. Virtualni destruktorji, kot navaja ime, uničijo objekt. Imamo osnovni razred in izpeljan razred, ki je izpeljan iz osnovnega razreda. Oba razreda imata svoje konstruktorje in destruktorje. Navidezni destruktor osvobodi spomine, ki so dodeljeni skozi objekt izpeljanega razreda, medtem ko izbriše objekte izpeljanega razreda z uporabo kazalca osnovnega razreda s ključno besedo »virtualni«.

Zakaj uporabljamo Virtual Destructor?

Ko je izvedba funkcij člana razreda končana ali se bo izvedba metode main() kmalu končala, se samodejno pokliče destruktor, da sprosti pomnilnik, ki je bil dodeljen med ustvarjanjem objekta. Zdaj pa, zakaj uporabljamo virtualni destruktor? Ko je osnovni razred izbrisan, ki kaže na izpeljani razred, se tukaj uporabi kazalec (*). Destruktor osnovnega razreda se kliče samo med tem postopkom. Destruktor izpeljanega razreda se ne kliče, kar vodi do težav. Eden od njih je težava z uhajanjem pomnilnika. Da bi se izognili tej težavi in ​​naredili našo kodo varno, navidezno uničimo objekte, da sprostimo pomnilniški prostor, ki je bil dodeljen med ustvarjanjem objektov, tako da izbrišemo destruktor osnovnega razreda.

Osnovni primer C++ brez navideznega destruktorja

Poglejmo, kako program deluje brez virtualnega destruktorja s preprostim programom, ki izbriše kazalec.

Koda:

#include

uporaba imenskega prostora std ;
razred Nadrejeni_razred0
{
javnosti :
Nadrejeni_razred0 ( )
{ cout << 'Konstruktor nadrejenega razreda' << konec ; }
~Nadrejeni_razred0 ( )
{ cout << 'Destruktor nadrejenega razreda' << konec ; }
} ;
razred Otrok_1 : javni Nadrejeni_razred0
{
javnosti :
Otrok_1 ( )
{ cout << 'Konstruktor podrejenega razreda' << konec ; }
~Otrok_1 ( )
{ cout << 'Uničevalec podrejenega razreda' << konec ; }
} ;
int glavni ( )
{
Nadrejeni_razred0 * kazalec = nov Otrok_1 ( ) ;
brisanje kazalca ;
vrnitev 0 ;
}

Ta koda pojasnjuje, kako se koda izvaja brez virtualnega destruktorja. Najprej ustvarite razred z imenom »Parent_Class0«, ki bo nadrejeni razred. Znotraj tega razreda ustvarite konstruktor in destruktor. Kot vemo, se konstruktor in destruktor imenujeta enako kot razred. Destruktor je predstavljen podobno kot konstruktor, vendar ima simbol (~), ki ga razlikuje od konstruktorja. Znotraj konstruktorja in destruktorja natisnite sporočilo z uporabo “cout<<”. Sedaj ustvarite še en razred, ki je 'Child_1'. Ta razred je izpeljan iz nadrejenega razreda, »Parent_Class0«. Izpeljani razred ima svoj konstruktor in destruktor, ki vsebujeta sporočilo za tiskanje na izhodnem zaslonu.

V metodi main() ustvarimo primerek »Parent_Class0« in mu dodelimo izpeljani razred. Bistvena točka, ki si jo je treba zapomniti v tem primeru, je, da uporabljamo kazalec za pridobitev nadrejenega razreda. Ko gre v nadrejeni razred, izvede konstruktor nadrejenega razreda. Nato gre v podrejeni razred in izvede svoj konstruktor. Preden izvede destruktor podrejenega razreda, mora izvesti destruktor nadrejenega razreda. Prevajalnik izvede destruktor nadrejenega razreda in prekine razred, ne da bi izvedel destruktor podrejenega razreda. To je problem; ne osvobodi spomina na otrokov razred. Predstavlja konstruktor nadrejenega razreda, konstruktor podrejenega razreda in destruktor nadrejenega razreda. To kaže, da se destruktor podrejenega razreda ne izvede. Po tej izvedbi izbrišemo kazalec v funkciji main().

Izhod:

Primer C++ z navideznim destruktorjem

Razpravljajmo o virtualnem destruktorju s preprosto kodo, da bomo razlikovali, kako deluje z in brez virtualnega destruktorja.

Koda:

#include

uporaba imenskega prostora std ;
razred Nadrejeni_razred0
{
javnosti :
Nadrejeni_razred0 ( )
{ cout << 'Konstruktor nadrejenega razreda' << konec ; }
virtualni ~Nadrejeni_razred0 ( )
{ cout << 'Destruktor nadrejenega razreda' << konec ; }
} ;
razred Otrok_1 : javni Nadrejeni_razred0
{
javnosti :
Otrok_1 ( )
{ cout << 'Konstruktor podrejenega razreda' << konec ; }
virtualni ~Otrok_1 ( )
{ cout << 'Uničevalec podrejenega razreda' << konec ; }
} ;
int glavni ( )
{
Nadrejeni_razred0 * kazalec = nov Otrok_1 ( ) ;
brisanje kazalca ;
vrnitev 0 ;
}

Prvi program je pojasnil problem, s katerim se soočamo, brez virtualnega destruktorja. Zdaj bo ta koda rešila to težavo z uporabo virtualnega destruktorja. Najprej kopirajte prvo kodo in samo dodajte eno ključno besedo na dveh mestih v tem programu. Ta beseda je 'virtualna'. Vstavite to besedo z destruktorjem nadrejenega razreda, »Parent_Class0«. Podobno omenite to z destruktorjem podrejenega razreda, ki je 'Child_1', ki izhaja iz nadrejenega razreda. Ta »navidezna« ključna beseda nekoliko spremeni in najprej izvede destruktor podrejenega razreda »Child_1«. Nato izvede destruktor nadrejenega razreda, »Parent_Class0«. Preostali del programa deluje enako, kot deluje brez virtualnega destruktorja. Z dodajanjem tega koščka kode lahko rešimo svoj pomnilnik pred uhajanjem. Zdaj na konzoli prikaže štiri sporočila. Najprej konstruktor nadrejenega razreda, nato konstruktor podrejenega razreda, destruktor podrejenega razreda in destruktor nadrejenega razreda. Na koncu izbrišemo kazalec znotraj metode main().

Izhod:

C++ primer čistega virtualnega destruktorja

V tej kodi bomo govorili o čistem virtualnem destruktorju, kako deluje in kako se razlikuje od virtualnega destruktorja.

Koda:

#include

razred Nadrejeni_0 {
javnosti :
virtualni ~Parent_0 ( ) = 0 ;
} ;
Nadrejeni_0 :: ~Nadrejeni_0 ( )
{
std :: cout << 'Pozdravljeni, jaz sem Pure Destructor. Poklicali ste me!' ;
}
razred Otrok_0 : javni Nadrejeni_0 {
javnosti :
~Otrok_0 ( ) { std :: cout << 'Izpeljani destruktor je tukaj \n ' ; }
} ;

int glavni ( )
{
Nadrejeni_0 * ptr_0 = nov Otrok_0 ( ) ;
izbriši ptr_0 ;
vrnitev 0 ;
}

Nadrejeni razred »Parent_0« je ustvarjen v prvem koraku kode. Znotraj njega ustvarite navidezni nadrejeni destruktor in mu dodelite 0. To nastavi navidezni destruktor na čisti navidezni destruktor, kar pomeni, da je nadrejeni razred zdaj abstrakten in ne moremo ustvariti primerkov tega razreda. Zunaj nadrejenega razreda “Parent_0” definirajte destruktorje in std::cout. Zahtevano besedilo je prikazano z uporabo std::cout. Nato izpeljite razred »Child_0« iz nadrejenega razreda in definirajte njegov destruktor. Znotraj destruktorja natisnite sporočilo. V funkciji main() ustvarite kazalec nadrejenega razreda in mu dodelite podrejeni razred.

Prevajalnik gre v nadrejeni razred »Parent_0«. Ko je kazalec ustvarjen, se samodejno pokliče njegov konstruktor. Nato gre prevajalnik v podrejeni razred, da prikliče njegov konstruktor. Po uspešni izvedbi konstruktorja izvede destruktor podrejenega razreda “Child_0”. Nato izvede destruktor nadrejenega razreda. Na ta način lahko naredimo čisti virtualni destruktor. Ni priporočljivo, da ga uporabite, ker z uporabo te metode nadrejeni razred postane abstrakten, zaradi česar je neuporaben. Metodologija, ki se večinoma uporablja, je virtualni destruktor in je dobra praksa.

Izhod:

Zaključek

Učili smo se o virtualnem destruktorju, začenši od koncepta OOP do premikanja proti konstruktorjem in destruktorjem. Po razlagi vseh teh smo podrobno razpravljali o virtualnem destruktorju s primeri kodiranja in čistim virtualnim destruktorjem. Preden razložimo virtualni destruktor, moramo vedeti o konstruktorjih, destruktorjih in dedovanju. Pri dedovanju podedujemo razrede od nadrejenega razreda. Podrejenih razredov je lahko več kot enega, nadrejeni razred pa je samo en. Navidezni destruktorji in čisti virtualni destruktorji se uporabljajo pri dedovanju, da se rešijo pred uhajanjem pomnilnika. Od osnovnega primera do naprednega primera smo zajeli vse, kar morate vedeti, da začnete uporabljati in praktično uničite pomnilnik izpeljanega razreda.