C++ Virtual Constructor

C Virtual Constructor



C++ ei auta meitä virtuaalisten konstruktorien rakentamisessa, koska luokan konstruktoria ei ole mahdollista ohittaa. Joten rakentajien virtualisointi on merkityksetöntä. C++-ohjelmassa ei ole ajatusta virtuaalisen konstruktorin luomisesta, mutta voimme luoda virtuaalisen destruktorin sinne. Voimme myös määritellä sen, koska konstruktorin ohjelmointia C++:ssa ei voida pitää virtuaalisena, koska kun luokan konstruktori kutsutaan, muisti ei sisällä virtuaalista taulukkoa, joka osoittaisi, että virtuaalista osoitinta ei luoda. Näin ollen rakentajan tulee olla ei-virtuaalinen koko ajan.

Virtuaalinen tuhoaja voi kuitenkin olla olemassa. Tässä näytämme, mitä tapahtuu, kun luomme virtuaalisen konstruktorin C++:ssa, sekä virtuaalisen rakentajan toiminnan virtuaalisen konstruktorin sijaan.

Esimerkki 1:

Luodaan virtuaalinen rakentaja ja aloitetaan koodi asettamalla 'iostream'-otsikkotiedosto. Tämä otsikkotiedosto on tarkoitettu funktioille, jotka on ilmoitettu siinä, kuten 'cin' ja 'cout'. Tämän jälkeen lisäämme 'std'-nimiavaruuden, joten emme voi lisätä tätä 'std' jokaiseen koodimme funktioon. Tämän jälkeen luomme luokan, joka on koodimme perusluokka nimellä “my_base” ja lisäämme sitten “public” luodaksesi virtuaalisen rakentajan.







Virtuaalinen konstruktori luodaan tänne sijoittamalla 'virtuaalinen' avainsana. Tämän virtuaalisen rakentajan sisään asetamme 'cout'-lauseen. Tämän alapuolelle luomme funktion nimeltä 'show', jossa hyödynnämme uudelleen 'cout'. Tämän jälkeen luomme tästä perusluokasta johdetun luokan nimellä 'my_derived' ja perustamme sitten 'my_derived()'-konstruktorin 'public'-kenttään. Lisäämme 'cout'-lauseen tähän 'my_derived()' -konstruktoriin. Sen alapuolelle rakennamme funktion nimeltä 'show', jossa käytämme 'cout' -toimintoa vielä kerran.



Nyt, kun kutsumme 'main()', luomme perusluokan osoittimen nimellä 'my_ptr' ja luomme myös johdetun luokan objektin, joka on 'Obj_d'. Tämän jälkeen määritämme kohteen 'Obj_d' osoitteen 'my_ptr':lle. Sitten kutsumme 'show()'-funktiota 'my_ptr' kautta.



Koodi 1:





#include
käyttämällä nimiavaruus std ;
luokkaa my_base
{
julkinen :
virtuaalinen my_base ( )
{
cout << 'Tässä on perusluokkani' << endl ;
}
mitätön näytä ( )
{
cout << 'perusluokan esitysfunktio' << endl ;
}
} ;
luokkaa my_derived : julkinen my_base
{
julkinen :
my_derived ( )
{
cout << 'Tässä on johdettu luokkani' << endl ;
}
mitätön näytä ( )
{
cout << 'johdannaisen luokan esitysfunktio' < näytä ( ) ;
}

Lähtö:
Täällä se näyttää virheilmoituksen, joka sanoo, että konstruktoria ei voida julistaa virtuaaliseksi C++-ohjelmoinnissa. Joten voimme nähdä, että C++ ei salli meidän luoda virtuaalista konstruktoria, mutta voimme luoda virtuaalisen destruktorin.



Esimerkki 2:

Ratkaistaan ​​edellinen ongelma ja luodaan virtuaalinen tuhoaja tähän koodiin. Kun olet ilmoittanut 'new_base'-luokan, asetamme 'julkisen' konstruktorin, johon luomme virtuaalisen destruktorin lisäämällä 'virtual ~' 'new_base' kanssa. Lisäämme 'cout'-lauseen tähän virtuaaliseen tuhoajaan. Sen alapuolelle rakennamme funktion nimeltä 'show', joka käyttää 'cout' -toimintoa. Seuraavaksi teemme johdetun luokan, joka on 'new_derived' tästä 'new_base'-perusluokasta, ja rakennamme 'new_derived()'-destruktorin 'public'-kenttään. Tähän 'new_derived()'-destruktoriin on nyt lisätty 'cout'-lause.

Sen alle luomme funktion nimeltä 'show', joka käyttää uudelleen 'cout'-lausetta. 'main()'-funktion kutsumisen jälkeen tuotamme nyt 'obj_d' johdetun luokan objektin sekä perusluokan osoittimen nimeltä 'ptr1'. Tämän jälkeen annamme 'obj_d'-osoitteen 'ptr1':lle. Seuraavaksi 'show()'-metodi kutsutaan komennolla 'ptr1'.

Koodi 2:

#include
käyttämällä nimiavaruus std ;
luokkaa new_base
{
julkinen :
virtuaalinen ~uusi_kanta ( )
{
cout << 'Perusluokan tuhoaja on täällä' << endl ;
}
mitätön näytä ( )
{
cout << 'Perusluokan esitystoiminto' << endl ;
}
} ;
luokkaa new_derived : julkinen new_base
{
julkinen :
~new_derived ( )
{
cout << 'Johdettu luokkatuhoaja on täällä' << endl ;
}
mitätön näytä ( )
{
cout << 'Perusluokan esitystoiminto' < näytä ( ) ;
}

Lähtö:
Tämä ohjelma käyttää 'new_base':n osoitinobjektia, joka osoittaa 'obj_d' johdettuun luokkaan. Siten se kutsuu ensin 'new_base'-luokan 'show()'-menetelmää. Sitten se kutsuu 'new_derived'-luokan '~new_derived()'-metodia ja näyttää perusluokan '~new_base'.

Esimerkki 3:

Tässä on toinen koodi 'virtuaalisen' rakentajan luomiseksi. Kun olet sisällyttänyt 'iostream'- ja 'std'-nimiavaruuden, luomme luokan 'B'. Tämän alapuolelle luomme 'julkisen' konstruktorin, joka on 'B()' ja sitten luomme 'cout'. Rakentaja- ja hävittäjäfunktiot määritellään käyttämällä 'julkista' pääsyn määrittelyä, jossa mikä tahansa luokan objekti voi kutsua.

Nyt luomme myös tämän perusluokan '~B()'-destruktorin, jossa hyödynnämme 'cout'-funktiota uudelleen. Sitten luomme 'D'-luokan, joka on 'B'-perusluokan johdettu luokka, ja asetamme 'julkisen' tähän. Tämän 'julkisen' sisällä luomme johdetun luokan konstruktorin sekä destruktorin nimillä 'D()' ja '~D'. Molemmissa on 'cout' sisällään. Nyt meillä on 'main()'-funktio. Tämän funktion kutsumisen jälkeen luomme perusluokan osoitinobjektin.

Sitten käytämme 'delete' -avainsanaa ja sijoitamme 'base_ptr' tähän. Tässä tapauksessa destruktorin tila poistetaan kutsumalla perusluokan osoitinobjektia.

Koodi 3:

#include
käyttämällä nimiavaruus std ;
luokkaa B
{
julkinen :
B ( )
{
cout << 'Perusluokan rakentaja' << endl ;
}
~B ( )
{
cout << 'Perusluokan tuhoaja' << endl ;
}
} ;

luokkaa D : julkinen B
{
julkinen :
D ( )
{
cout << 'Johdetun luokan rakentaja' << endl ;
}
~D ( )
{
cout << 'Johdetun luokan tuhoaja' << endl ;
}
} ;
int pää ( )
{
B * base_ptr = Uusi D ;
poistaa base_ptr ;
}

Lähtö:
Tulos osoittaa, että se käyttää osoitinobjektia, joka osoittaa pääfunktion 'B'-luokkaan. Siten se kutsuu ensin 'B'-luokan 'konstruktori()'. Sitten se kutsuu 'D'-luokan 'konstruktori()'. Sen jälkeen 'B'- ja 'D'-luokkien tuhoajien hallussa oleva osoitinobjekti poistetaan. Ilman ohjelman 'D'-luokan tuhoajaa kutsumista 'B'-luokan osoitin eliminoi vain 'B'-luokan tuhoajan. Tämän seurauksena ohjelman muisti on vioittunut.

Johtopäätös

Keskustelimme 'virtuaalisen rakentamisen' käsitteestä C++-ohjelmoinnissa. Selvitimme, että emme voi luoda virtuaalista rakentajaa C++:ssa, mutta voimme luoda virtuaalisen destruktorin koodeissamme. Tässä näytimme, mitä tapahtui, kun luomme virtuaalisen konstruktorin C++-ohjelmointiin ja virtuaalisen destructorin toiminnan koodeissamme. Opimme, että rakentaja ei voi olla virtuaalinen, mutta voimme luoda virtuaalisen destruktorin luokassamme. Esitimme joitain esimerkkejä ja selitimme nämä koodit perusteellisesti tässä oppaassa.