C++ virtuaalne konstruktor

C Virtuaalne Konstruktor



C++ ei võimalda meil luua virtuaalseid konstruktoreid, kuna klassi konstruktorit pole võimalik alistada. Seega on konstruktori virtualiseerimine mõttetu. C++ programmis pole virtuaalse konstruktori loomise kontseptsiooni, kuid me võime seal luua virtuaalse destruktori. Samuti saame selle defineerida, kuna konstruktori programmeerimist C++ keeles ei saa pidada virtuaalseks, kuna klassi konstruktori väljakutsumisel ei sisalda mälu virtuaalset tabelit, mis näitab, et virtuaalset osutit pole loodud. Seega peaks konstruktor olema kogu aeg mittevirtuaalne.

Siiski võib virtuaalne hävitaja eksisteerida. Siin näitame, mis juhtub, kui loome C++-s virtuaalse konstruktori, samuti virtuaalse konstruktori asemel virtuaalse destruktori tööd.

Näide 1:

Loome virtuaalse konstruktori ja alustame oma koodi, asetades päisefaili 'iostream'. See päisefail on selles deklareeritud funktsioonide jaoks, nagu 'cin' ja 'cout'. Pärast seda lisame nimeruumi 'std', nii et me ei saa seda 'std' lisada oma koodi iga funktsiooniga. Pärast seda loome klassi, mis on meie koodi baasklass nimega “my_base” ja seejärel lisame virtuaalse konstruktori loomiseks “public”.







Siin luuakse virtuaalne konstruktor, asetades märksõna 'virtuaalne'. Selle virtuaalse konstruktori sisse asetame lause 'cout'. Selle all loome funktsiooni nimega 'show', milles kasutame uuesti 'cout'. Pärast seda loome sellest baasklassist tuletatud klassi nimega “my_derived” ja seejärel loome väljale “public” konstruktori “my_derived()”. Sisestame sellesse konstruktorisse 'my_derived()' lause 'cout'. Selle alla konstrueerime funktsiooni nimega 'show', kus kasutame veel kord 'cout'.



Nüüd, pärast 'main()' kutsumist, loome baasklassi kursori nimega 'my_ptr' ja loome ka tuletatud klassi objekti, milleks on 'Obj_d'. Pärast seda määrame objektile 'my_ptr' objekti 'Obj_d' aadressi. Seejärel kutsume funktsiooni 'show()' läbi 'my_ptr'.



Kood 1:





#include
kasutades nimeruum std ;
klass minu_baas
{
avalik :
virtuaalne minu_baas ( )
{
cout << 'Siin on minu baasklass' << endl ;
}
tühine näidata ( )
{
cout << 'põhiklassi näitamise funktsioon' << endl ;
}
} ;
klass minu_tuletatud : avalik minu_baas
{
avalik :
minu_tuletatud ( )
{
cout << 'Siin on minu tuletatud klass' << endl ;
}
tühine näidata ( )
{
cout << 'tuletatud klassi näitamise funktsioon' < näidata ( ) ;
}

Väljund:
Siin kuvatakse veateade, mis ütleb, et konstruktorit ei saa C++ programmeerimises virtuaalseks deklareerida. Seega näeme, et C++ ei võimalda meil luua virtuaalset konstruktorit, kuid võime luua virtuaalse destruktori.



Näide 2:

Lahendame eelmise probleemi ja loome selles koodis virtuaalse hävitaja. Pärast klassi “new_base” deklareerimist asetame konstruktori “avalik”, millesse loome virtuaalse hävitaja, lisades “virtuaalne ~” koos “new_base”-ga. Sisestame sellesse virtuaalsesse hävitajasse lause 'cout'. Selle alla konstrueerime funktsiooni 'show', mis kasutab 'cout'. Järgmisena loome tuletatud klassi, mis on sellest 'new_base' baasklassist 'new_derived' ja konstrueerime väljale 'avalik' hävitaja 'new_derived()'. Sellele 'new_derived()' hävitajale on nüüd lisatud lause 'cout'.

Selle alla loome funktsiooni 'show', mis kasutab taas lauset 'cout'. Pärast funktsiooni 'main()' väljakutsumist toodame nüüd objekti 'obj_d' tuletatud klassist ja baasklassi kursorist nimega 'ptr1'. Pärast seda anname 'ptr1'-le aadressi 'obj_d'. Järgmisena käivitatakse meetod 'show()', kasutades 'ptr1'.

Kood 2:

#include
kasutades nimeruum std ;
klass uus_base
{
avalik :
virtuaalne ~uus_base ( )
{
cout << 'Baasklassi hävitaja on siin' << endl ;
}
tühine näidata ( )
{
cout << 'Põhiklassi näitamise funktsioon' << endl ;
}
} ;
klass uus_tuletatud : avalik uus_base
{
avalik :
~uus_tuletatud ( )
{
cout << 'Tuletatud klasside hävitaja on siin' << endl ;
}
tühine näidata ( )
{
cout << 'Põhiklassi näitamise funktsioon' < näidata ( ) ;
}

Väljund:
See programm kasutab 'new_base' osutiobjekti, mis osutab tuletatud klassile 'obj_d'. Seega kutsub see kõigepealt välja klassi 'new_base' meetodi 'show()'. Seejärel kutsub see välja klassi 'new_derived' meetodi '~new_derived()' ja kuvab baasklassi '~new_base'.

Näide 3:

Siin on veel üks kood 'virtuaalse' konstruktori loomiseks. Pärast nimeruumi 'iostream' ja 'std' lisamist genereerime klassi 'B'. Selle all loome 'avaliku' konstruktori, mis on 'B()' ja seejärel genereerime 'cout'. Konstruktori ja destruktori funktsioonid defineeritakse avaliku juurdepääsu spetsifikaatori abil, mille kaudu saavad helistada kõik klassi objektid.

Nüüd loome ka selle baasklassi hävitaja '~B()', milles kasutame uuesti 'cout'. Seejärel loome 'D' klassi, mis on 'B' põhiklassi tuletatud klass, ja asetame siia 'avalikkuse'. Selle “avalikkuse” sees loome nii tuletatud klassi konstruktori kui ka hävitaja nimedega “D()” ja “~D”. Mõlemad sisaldavad 'cout' nende sees. Nüüd on meil funktsioon 'main ()'. Pärast selle funktsiooni kutsumist genereerime baasklassi osutiobjekti.

Seejärel kasutame märksõna 'kustuta' ja asetame siia 'base_ptr'. Sel juhul kustutatakse destruktori ruum, kutsudes välja põhiklassi osutiobjekti.

Kood 3:

#include
kasutades nimeruum std ;
klass B
{
avalik :
B ( )
{
cout << 'Baasklassi konstruktor' << endl ;
}
~B ( )
{
cout << 'Baasklassi hävitaja' << endl ;
}
} ;

klass D : avalik B
{
avalik :
D ( )
{
cout << 'Tuletatud klassi konstruktor' << endl ;
}
~D ( )
{
cout << 'Tuletatud klassi hävitaja' << endl ;
}
} ;
int peamine ( )
{
B * baas_ptr = uus D ;
kustutada baas_ptr ;
}

Väljund:
Tulemus näitab, et see kasutab osutiobjekti, mis osutab põhifunktsiooni B-klassile. Seega kutsub see kõigepealt välja B-klassi konstruktori ()). Seejärel kutsub see esile D-klassi konstruktori ()). Seejärel kustutatakse kursoriobjekt, mida hoiavad klasside “B” ja “D” hävitajad. Ilma programmis D-klassi hävitajat kutsumata kõrvaldab B-klassi osuti ainult B-klassi hävitaja. Selle tulemusena on programmi mälu rikutud.

Järeldus

Arutasime “virtuaalse ehituse” kontseptsiooni C++ programmeerimises. Uurisime, et me ei saa C++-s virtuaalset konstruktorit luua, kuid võime luua oma koodides virtuaalse destruktori. Siin näitasime, mis juhtus virtuaalse konstruktori loomisel C++ programmeerimises ja virtuaalse destruktori toimimist meie koodides. Saime teada, et konstruktor ei saa olla virtuaalne, kuid me saame oma klassis luua virtuaalse hävitaja. Näidasime selles juhendis mõnda näidet ja selgitasime neid koode põhjalikult.