Virtualni konstruktor C++

Virtualni Konstruktor C



C++ nam ne olajša konstruiranja virtualnih konstruktorjev, saj ni mogoče preglasiti konstruktorja razreda. Torej je virtualizacija konstruktorja nesmiselna. V programu C++ ni koncepta ustvarjanja navideznega konstruktorja, vendar lahko tam ustvarimo navidezni destruktor. Lahko ga tudi definiramo, saj programiranja konstruktorja v C++ ni mogoče šteti za navideznega, ker ko je priklican konstruktor razreda, pomnilnik ne vsebuje navidezne tabele, kar pomeni, da ni ustvarjen navidezni kazalec. Zato bi moral biti konstruktor ves čas nenavidezen.

Vendar bi lahko obstajal virtualni destruktor. Tukaj bomo pokazali, kaj se zgodi, ko ustvarimo virtualni konstruktor v C++, kot tudi delovanje virtualnega destruktorja namesto virtualnega konstruktorja.

Primer 1:

Ustvarimo virtualni konstruktor in začnimo našo kodo tako, da postavimo datoteko glave »iostream«. Ta datoteka glave je za funkcije, ki so v njej deklarirane, kot sta 'cin' in 'cout'. Po tem dodamo imenski prostor »std«, zato tega »std« ne moremo dodati vsaki funkciji v naši kodi. Po tem ustvarimo razred, ki je osnovni razred naše kode z imenom 'my_base' in nato dodamo 'public', da ustvarimo virtualni konstruktor.







Virtualni konstruktor je tukaj ustvarjen z vnosom ključne besede »virtual«. Znotraj tega virtualnega konstruktorja postavimo stavek 'cout'. Pod tem ustvarimo funkcijo z imenom 'show', v kateri ponovno uporabimo 'cout'. Po tem ustvarimo izpeljan razred tega osnovnega razreda z imenom “my_derived” in nato vzpostavimo konstruktor “my_derived()” v polju “public”. V ta konstruktor 'my_derived()' vstavimo stavek 'cout'. Pod njim sestavimo funkcijo, imenovano 'show', kjer ponovno uporabimo 'cout'.



Zdaj, ko prikličemo »main()«, ustvarimo kazalec osnovnega razreda z imenom »my_ptr« in ustvarimo tudi objekt izpeljanega razreda, ki je »Obj_d«. Po tem dodelimo naslov 'Obj_d' 'my_ptr'. Nato prek »my_ptr« pokličemo funkcijo »show()«.



Koda 1:





#include
uporabo imenski prostor std ;
razred moja_baza
{
javnosti :
virtualni moja_baza ( )
{
cout << 'Tu je moj osnovni razred' << konec ;
}
praznina pokazati ( )
{
cout << 'pokaži funkcijo osnovnega razreda' << konec ;
}
} ;
razred moj_izvedeno : javnosti moja_baza
{
javnosti :
moj_izvedeno ( )
{
cout << 'Tu je moj izpeljani razred' << konec ;
}
praznina pokazati ( )
{
cout << 'pokaži funkcijo izpeljanega razreda' < pokazati ( ) ;
}

Izhod:
Tukaj prikaže sporočilo o napaki, ki pravi, da konstruktorja ni mogoče razglasiti za navideznega v programiranju C++. Torej lahko vidimo, da nam C++ ne dovoljuje generiranja navideznega konstruktorja, lahko pa ustvarimo navidezni destruktor.



Primer 2:

Rešimo prejšnji problem in ustvarimo virtualni destruktor v tej kodi. Po deklaraciji razreda “new_base” postavimo “javni” konstruktor, v katerega ustvarimo virtualni destruktor, tako da dodamo “virtual ~” z “new_base”. V ta virtualni destruktor vstavimo stavek 'cout'. Pod njim izdelamo funkcijo, imenovano 'show', ki uporablja 'cout'. Nato naredimo izpeljani razred, ki je »new_derived« iz tega osnovnega razreda »new_base«, in izdelamo destruktor »new_derived()« v polju »public«. Temu destruktorju »new_derived()« je zdaj dodan stavek »cout«.

Pod njim ustvarimo funkcijo, imenovano 'show', ki ponovno uporablja stavek 'cout'. Po klicu funkcije »main()« zdaj izdelamo objekt izpeljanega razreda »obj_d« in kazalec osnovnega razreda z imenom »ptr1«. Po tem damo naslov 'obj_d' 'ptr1'. Nato se prikliče metoda “show()” z uporabo “ptr1”.

Koda 2:

#include
uporabo imenski prostor std ;
razred nova_osnova
{
javnosti :
virtualni ~nova_osnova ( )
{
cout << 'Destruktor osnovnega razreda je tukaj' << konec ;
}
praznina pokazati ( )
{
cout << 'Prikaži funkcijo osnovnega razreda' << konec ;
}
} ;
razred novo_izpeljano : javnosti nova_osnova
{
javnosti :
~novo_izpeljano ( )
{
cout << 'Destruktor izpeljanega razreda je tukaj' << konec ;
}
praznina pokazati ( )
{
cout << 'Prikaži funkcijo osnovnega razreda' < pokazati ( ) ;
}

Izhod:
Ta program uporablja objekt kazalca »new_base«, ki kaže na izpeljan razred »obj_d«. Tako najprej pokliče metodo »show()« razreda »new_base«. Nato pokliče metodo »~new_derived()« razreda »new_derived« in prikaže »~new_base« osnovnega razreda.

Primer 3:

Tukaj je še ena koda za ustvarjanje 'virtualnega' konstruktorja. Po vključitvi imenskega prostora »iostream« in »std« ustvarimo razred »B«. Pod tem ustvarimo 'javni' konstruktor, ki je 'B()', in nato ustvarimo 'cout'. Funkciji konstruktorja in destruktorja sta definirani z uporabo 'javnega' specifikatorja dostopa, v katerem lahko kliče kateri koli objekt v razredu.

Zdaj ustvarimo tudi destruktor »~B()« tega osnovnega razreda, v katerem ponovno uporabimo »cout«. Nato ustvarimo razred »D«, ki je izpeljan razred osnovnega razreda »B«, in sem postavimo »public«. Znotraj te »javnosti« ustvarimo konstruktor in destruktor izpeljanega razreda z imeni »D()« oziroma »~D«. Oba vsebujeta 'cout' v sebi. Zdaj imamo funkcijo 'main()'. Po klicu te funkcije ustvarimo objekt kazalca osnovnega razreda.

Nato uporabimo ključno besedo »delete« in sem postavimo »base_ptr«. V tem primeru se prostor destruktorja izbriše s klicem kazalnega objekta osnovnega razreda.

Koda 3:

#include
uporabo imenski prostor std ;
razred B
{
javnosti :
B ( )
{
cout << 'Konstruktor osnovnega razreda' << konec ;
}
~B ( )
{
cout << 'Destruktor osnovnega razreda' << konec ;
}
} ;

razred D : javnosti B
{
javnosti :
D ( )
{
cout << 'Konstruktor izpeljanega razreda' << konec ;
}
~D ( )
{
cout << 'Destruktor izpeljanega razreda' << konec ;
}
} ;
int glavni ( )
{
B * osnovni_ptr = novo D ;
izbrisati osnovni_ptr ;
}

Izhod:
Rezultat kaže, da uporablja objekt kazalca, ki kaže na razred »B« v glavni funkciji. Tako najprej pokliče »constructor()« razreda »B«. Nato pokliče »constructor()« razreda »D«. Objekt kazalca, ki ga imajo destruktorji razredov »B« in »D«, se nato izbriše. Brez priklica destruktorja razreda 'D' znotraj programa, kazalec razreda 'B' izloči samo destruktor razreda 'B'. Posledično je pomnilnik programa poškodovan.

Zaključek

Razpravljali smo o konceptu 'virtualne konstrukcije' v programiranju C++. Raziskali smo, da ne moremo ustvariti navideznega konstruktorja v C++, lahko pa ustvarimo navidezni destruktor v naših kodah. Tukaj smo pokazali, kaj se zgodi, ko ustvarimo navidezni konstruktor v programiranju C++ in delovanje navideznega destruktorja v naših kodah. Naučili smo se, da konstruktor ne more biti virtualen, lahko pa ustvarimo virtualni destruktor v našem razredu. V tem priročniku smo prikazali nekaj primerov in te kode natančno razložili.