Virtuaalne hävitaja C++ keeles

Virtuaalne Havitaja C Keeles



C++ on keel, mida kasutatakse programmeerimise põhikontseptsiooni põhja andmiseks ja mis muudab programmeerijate loogilise mõtlemise tugevaks. C++-s mängib OOP üliolulist rolli, kuna OOP on objektorienteeritud keel, mis loob klasside objekte. OOP-is uurime klasse ja objekte. Klassid sisaldavad andmeliikmeid, mis on erinevat tüüpi muutujad ja erinevad liikmefunktsioonid. Eksemplaride abil pääseme ligi mis tahes klassi andmetele. Igal klassil on klassi loomisel oma konstrueerija ja hävitaja. Konstruktoriks nimetatakse iseennast, kui selle klassi objekt luuakse. Samuti saame klassi muutujaid initsialiseerida konstruktori sees. Destruktorid luuakse samuti automaatselt koos konstruktoriga, kuid hävitajad hävitavad objekti ja see on viimane funktsioon, mis enne objekti hävitamist välja kutsutakse. Luuakse klassi nimi, näiteks klass “Elukutse”. Selle konstrueerija on Profession () ja hävitaja on ~ Profession (). Neil kolmel on sama nimi.

Pärast OOP-ist, konstruktoritest ja hävitajatest rääkimist räägime nüüd virtuaalsetest hävitajatest. Virtuaalsed hävitajad hävitavad objekti, nagu nimigi täpsustab. Meil on põhiklass ja tuletatud klass, mis on tuletatud baasklassist. Mõlemal klassil on oma konstrueerijad ja hävitajad. Virtuaalne hävitaja vabastab tuletatud klassiobjekti kaudu eraldatud meenutused, kustutades samal ajal tuletatud klassi objektid, kasutades põhiklassi osutit koos võtmesõnaga 'virtuaalne'.

Miks me kasutame virtuaalset hävitajat?

Kui klassiliikme funktsioonide täitmine on lõppenud või meetodi main() täitmine on lõppemas, kutsutakse automaatselt välja hävitaja, et vabastada objekti loomisel eraldatud mälu. Miks me kasutame virtuaalset hävitajat? Kui tuletatud klassile osutav põhiklass kustutatakse, kasutatakse siin kursorit (*). Põhiklasside destruktori kutsutakse välja ainult selle protsessi käigus. Tuletatud klassidestruktorit ei kutsuta, mis põhjustab probleeme. Üks neist on mälulekke probleem. Selle probleemi vältimiseks ja koodi turvaliseks muutmiseks hävitame objektid praktiliselt, et vabastada objektide loomisel eraldatud mäluruumi, kustutades baasklasside destruktori.

C++ põhinäide ilma virtuaalse hävitajata

Vaatame, kuidas programm töötab ilma virtuaalse destruktorita lihtsa programmiga, mis kursori kustutab.

Kood:

#include

kasutades nimeruumi std ;
klass Vanem_klass0
{
avalik :
Vanem_klass0 ( )
{ cout << 'Vanemklassi ehitaja' << endl ; }
~ Vanem_klass0 ( )
{ cout << 'Vanemate klassi hävitaja' << endl ; }
} ;
klass Laps_1 : avalik Vanem_klass0
{
avalik :
Laps_1 ( )
{ cout << 'Lapsklassi ehitaja' << endl ; }
~Laps_1 ( )
{ cout << 'Lapsklassi hävitaja' << endl ; }
} ;
int peamine ( )
{
Vanem_klass0 * osuti = uus laps_1 ( ) ;
kustuta kursor ;
tagasi 0 ;
}

See kood selgitab, kuidas kood käivitatakse ilma virtuaalse hävitajata. Kõigepealt looge klass nimega 'Parent_Class0', millest saab ülemklass. Selle klassi sees looge konstruktor ja hävitaja. Nagu me teame, nimetatakse konstruktorit ja hävitajat sama, mis klassi. Destruktorit kujutatakse sarnaselt konstruktoriga, kuid sellel on sümbol (~), mis eristab seda konstruktorist. Printige konstruktori ja hävitaja sees sõnum, kasutades 'cout<<'. Nüüd looge teine ​​klass, mille nimi on 'Laps_1'. See klass on tuletatud ülemklassist 'Parent_Class0'. Tuletatud klassil on oma konstruktor ja hävitaja, mis sisaldavad väljundekraanile printimiseks sõnumit.

Meetodis main() loome 'Parent_Class0' eksemplari ja määrame sellele tuletatud klassi. Oluline punkt, mida sel juhul meeles pidada, on see, et kasutame ülemklassi toomiseks kursorit. Kui see läheb ülemklassi, käivitab see ülemklassi konstruktori. Seejärel läheb see lapsklassi ja käivitab selle konstruktori. Enne alamklassi hävitaja käivitamist peab see käivitama vanemklassi hävitaja. Kompilaator käivitab vanemklassi destruktori ja lõpetab klassi ilma alamklassi hävitajat käivitamata. See on probleem; see ei vabasta lapse klassi mälu. See esindab vanemklassi konstrueerijat, alamklassi konstrueerijat ja vanemklassi konstrueerijat. See näitab, et alamklassi hävitajat ei hukata. Pärast seda täitmist kustutame funktsiooni main() osuti.

Väljund:

C++ näide virtuaalse hävitajaga

Arutleme virtuaalse hävitaja üle lihtsa koodiga, et eristada, kuidas see töötab virtuaalse hävitajaga ja ilma.

Kood:

#include

kasutades nimeruumi std ;
klass Vanem_klass0
{
avalik :
Vanem_klass0 ( )
{ cout << 'Vanemklassi ehitaja' << endl ; }
virtuaalne ~Parent_Class0 ( )
{ cout << 'Vanemate klassi hävitaja' << endl ; }
} ;
klass Laps_1 : avalik Vanem_klass0
{
avalik :
Laps_1 ( )
{ cout << 'Lapsklassi ehitaja' << endl ; }
virtuaalne ~laps_1 ( )
{ cout << 'Lapsklassi hävitaja' << endl ; }
} ;
int peamine ( )
{
Vanem_klass0 * osuti = uus laps_1 ( ) ;
kustuta kursor ;
tagasi 0 ;
}

Esimene programm selgitas probleemi, millega me silmitsi seisame ilma virtuaalse hävitajata. Nüüd lahendab see kood selle probleemi virtuaalse hävitaja abil. Esmalt kopeerige esimene kood ja lisage lihtsalt üks märksõna kahes kohas selles programmis. See sõna on 'virtuaalne'. Sisestage see sõna koos vanemklassi destruktoriga 'Parent_Class0'. Samamoodi mainige seda alamklassi hävitajaga, milleks on 'Child_1', mis on tuletatud vanemklassist. See 'virtuaalne' märksõna muudab veidi ja käivitab kõigepealt alamklassi 'Child_1' hävitaja. Seejärel käivitab see vanemklassi hävitaja 'Parent_Class0'. Ülejäänud programm töötab samamoodi nagu ilma virtuaalse hävitajata. Selle väikese koodijupi lisamisega saame oma mälu lekke eest säästa. Nüüd kuvab see konsoolil neli teadet. Esiteks vanemklassi konstrueerija, seejärel lapsklassi konstrueerija, lapsklassi konstrueerija ja vanemklassi konstrueerija. Lõpuks kustutame kursori main() meetodis.

Väljund:

C++ Pure Virtual Destructori näide

Selles koodis räägime puhtast virtuaalsest hävitajast, kuidas see töötab ja mille poolest see virtuaalsest hävitajast erineb.

Kood:

#include

klass Vanem_0 {
avalik :
virtuaalne ~Parent_0 ( ) = 0 ;
} ;
Vanem_0 :: ~Vanem_0 ( )
{
std :: cout << 'Tere, ma olen puhas hävitaja. Sa kutsusid mind!' ;
}
klass Laps_0 : avalik Vanem_0 {
avalik :
~Laps_0 ( ) { std :: cout << 'Tuletatud hävitaja on siin \n ' ; }
} ;

int peamine ( )
{
Vanem_0 * ptr_0 = uus laps_0 ( ) ;
kustuta ptr_0 ;
tagasi 0 ;
}

Vanemklass “Vanem_0” luuakse koodi esimeses etapis. Selle sees looge virtuaalne vanemhävitaja ja määrake see 0-ga. See seab virtuaalseks hävitajaks puhta virtuaalse destruktori, mis tähendab, et ülemklass on nüüd abstraktne ja me ei saa selle klassi eksemplare luua. Väljaspool ülemklassi “Vanem_0” määrake hävitajad ja std::cout. Vajalik tekst kuvatakse std::cout abil. Seejärel tuletage põhiklassist klass „Child_0” ja määrake selle hävitaja. Printige hävitaja sees sõnum. Looge funktsioonis main() vanemklassi osuti ja määrake sellele alamklass.

Kompilaator läheb vanemklassi “Vanem_0”. Kui kursor luuakse, kutsutakse automaatselt välja selle konstruktor. Seejärel läheb kompilaator alamklassi, et kutsuda välja oma konstruktor. Pärast konstruktori edukat täitmist käivitab see alamklassi 'Laps_0' hävitaja. Seejärel käivitab see vanemklassi hävitaja. Nii saame teha puhta virtuaalse hävitaja. Seda ei soovitata kasutada, sest selle meetodi kasutamisel muutub vanemklass abstraktseks, mis muudab selle kasutuks. Enamasti kasutatav metoodika on virtuaalne hävitaja ja see on hea tava.

Väljund:

Järeldus

Õppisime tundma virtuaalset hävitajat, alustades OOP-i kontseptsioonist kuni konstruktorite ja hävitajate poole liikumiseni. Pärast kõigi nende selgitamist arutasime üksikasjalikult virtuaalset hävitajat koos kodeerimisnäidetega ja puhast virtuaalset hävitajat. Enne virtuaalse hävitaja selgitamist peame teadma konstruktoreid, hävitajaid ja pärandit. Pärimisel pärime klassid vanemklassilt. Lapsklasse võib olla rohkem kui üks, kuid vanemklass on ainult üks. Mälu lekke eest säästmiseks rakendatakse pärandina virtuaalseid hävitajaid ja puhtaid virtuaalseid hävitajaid. Alates põhinäitest kuni täiustatud näiteni käsitlesime kõike, mida peaksite teadma, et alustada kasutamist ja tuletatud klassi mälu praktiliselt hävitada.