C++ virtualus konstruktorius

C Virtualus Konstruktorius



C++ nepadeda mums kurti virtualių konstruktorių, nes neįmanoma nepaisyti klasės konstruktoriaus. Taigi konstruktoriaus virtualizavimas yra beprasmis. Nėra koncepcijos sukurti virtualų konstruktorių C++ programoje, tačiau galime sukurti virtualų naikintuvą. Taip pat galime jį apibrėžti, nes konstruktoriaus programavimas C++ negali būti laikomas virtualiu, nes kai iškviečiamas klasės konstruktorius, atmintyje nėra virtualios lentelės, rodančios, kad virtualus žymeklis nesukurtas. Taigi konstruktorius visą laiką turi būti nevirtualus.

Tačiau virtualus naikintojas gali egzistuoti. Čia parodysime, kas nutinka, kai sukuriame virtualų konstruktorių C++, taip pat kaip veikia virtualus naikintuvas, o ne virtualus konstruktorius.

1 pavyzdys:

Sukurkime virtualų konstruktorių ir pradėkime kodą įdėdami „iostream“ antraštės failą. Šis antraštės failas skirtas funkcijoms, kurios yra jame deklaruotos, pvz., „cin“ ir „cout“. Po to pridedame „std“ vardų erdvę, todėl negalime pridėti šios „std“ su kiekviena mūsų kodo funkcija. Po to sukuriame klasę, kuri yra pagrindinė mūsų kodo klasė pavadinimu „mano_bazė“, tada pridedame „public“, kad sukurtume virtualų konstruktorių.







Virtualus konstruktorius čia sukuriamas įdėjus raktinį žodį „virtualus“. Šiame virtualiame konstruktoriuje įdedame teiginį „cout“. Žemiau sukuriame funkciją, pavadintą „show“, kurioje vėl naudojame „cout“. Po to sukuriame išvestinę šios pagrindinės klasės klasę pavadinimu „my_derived“, o tada „viešajame“ lauke sukuriame konstruktorių „my_derived()“. Į šį „my_derived()“ konstruktorių įterpiame teiginį „cout“. Po juo sukuriame funkciją, vadinamą „show“, kur dar kartą naudojame „cout“.



Dabar, iškvietę „main()“, sukuriame pagrindinės klasės rodyklę pavadinimu „my_ptr“ ir taip pat sukuriame išvestinės klasės objektą, kuris yra „Obj_d“. Po to „Obj_d“ adresą priskiriame „my_ptr“. Tada funkciją „show()“ iškviečiame per „my_ptr“.



1 kodas:





#include
naudojant vardų erdvė std ;
klasė mano_bazė
{
viešas :
virtualus mano_bazė ( )
{
cout << 'Čia yra mano pagrindinė klasė' << endl ;
}
tuštuma Rodyti ( )
{
cout << 'bazinės klasės rodymo funkcija' << endl ;
}
} ;
klasė mano_išvestas : viešas mano_bazė
{
viešas :
mano_išvestas ( )
{
cout << 'Štai mano kilusi klasė' << endl ;
}
tuštuma Rodyti ( )
{
cout << „išvestinės klasės rodymo funkcija“ < Rodyti ( ) ;
}

Išvestis:
Čia rodomas klaidos pranešimas, kuriame sakoma, kad konstruktorius negali būti paskelbtas virtualiu C++ programavimuose. Taigi, matome, kad C++ neleidžia generuoti virtualaus konstruktoriaus, bet galime sukurti virtualų naikintuvą.



2 pavyzdys:

Išspręskime ankstesnę problemą ir šiame kode sukurkime virtualų naikintuvą. Paskelbę 'new_base' klasę, įdedame 'public' konstruktorių, kuriame sukuriame virtualų naikintuvą, pridėdami 'virtual ~' su 'new_base'. Į šį virtualų naikintuvą įterpiame teiginį „cout“. Po juo mes sukuriame funkciją, vadinamą „show“, kuri naudoja „cout“. Tada sukuriame išvestinę klasę, kuri yra „new_derived“ iš šios „new_base“ pagrindinės klasės, ir „viešajame“ lauke sukuriame „new_derived()“ destruktorių. Prie šio „new_derived()“ destruktoriaus dabar pridėtas teiginys „cout“.

Po juo sukuriame funkciją „show“, kuri vėl naudoja „cout“ teiginį. Iškvietę funkciją „main()“, dabar sukuriame „obj_d“ išvestinės klasės objektą ir pagrindinės klasės žymeklį, pavadintą „ptr1“. Po to mes suteikiame 'obj_d' adresą 'ptr1'. Tada „show()“ metodas iškviečiamas naudojant „ptr1“.

2 kodas:

#include
naudojant vardų erdvė std ;
klasė new_base
{
viešas :
virtualus ~nauja_bazė ( )
{
cout << „Pagrindinės klasės naikintojas yra čia“ << endl ;
}
tuštuma Rodyti ( )
{
cout << „Pagrindinės klasės šou funkcija“ << endl ;
}
} ;
klasė naujas_išvestas : viešas new_base
{
viešas :
~naujas_išvestas ( )
{
cout << „Išvestinis klasių naikintojas yra čia“ << endl ;
}
tuštuma Rodyti ( )
{
cout << „Pagrindinės klasės šou funkcija“ < Rodyti ( ) ;
}

Išvestis:
Ši programa naudoja žymeklio objektą „new_base“, kuris nurodo „obj_d“ išvestinę klasę. Taigi pirmiausia iškviečiamas „new_base“ klasės „show()“ metodas. Tada jis iškviečia „new_derived“ klasės metodą „~new_derived()“ ir parodo pagrindinės klasės „~new_base“.

3 pavyzdys:

Štai dar vienas kodas „virtualiam“ konstruktoriui generuoti. Įtraukę „iostream“ ir „std“ vardų erdvę, sukuriame „B“ klasę. Žemiau sukuriame „viešąjį“ konstruktorių, kuris yra „B()“, tada sugeneruojame „cout“. Konstruktoriaus ir naikintojo funkcijos apibrėžiamos naudojant „viešosios“ prieigos specifikaciją, kurioje gali skambinti bet kuris klasės objektas.

Dabar taip pat sukuriame šios pagrindinės klasės „~B()“ destruktorių, kuriame vėl naudojame „cout“. Tada sukuriame „D“ klasę, kuri yra išvestinė „B“ pagrindinės klasės klasė, ir čia patalpiname „viešą“. Šioje „viešojoje“ viduje sukuriame konstruktorių ir išvestinės klasės naikintuvą atitinkamai pavadinimais „D()“ ir „~D“. Abiejuose yra 'cout' jų viduje. Dabar turime funkciją „main ()“. Iškvietę šią funkciją, sugeneruojame bazinės klasės rodyklės objektą.

Tada naudojame raktinį žodį „delete“ ir čia patalpiname „base_ptr“. Tokiu atveju destruktoriaus erdvė ištrinama iškviečiant bazinės klasės rodyklės objektą.

3 kodas:

#include
naudojant vardų erdvė std ;
klasė B
{
viešas :
B ( )
{
cout << „Pagrindinės klasės konstruktorius“ << endl ;
}
~B ( )
{
cout << „Pagrindinės klasės naikintojas“ << endl ;
}
} ;

klasė D : viešas B
{
viešas :
D ( )
{
cout << „Išvestinės klasės konstruktorius“ << endl ;
}
~D ( )
{
cout << „Išvestinės klasės naikintojas“ << endl ;
}
} ;
tarpt pagrindinis ( )
{
B * bazinis_ptr = naujas D ;
Ištrinti bazinis_ptr ;
}

Išvestis:
Rezultatas rodo, kad jis naudoja žymeklio objektą, kuris pagrindinėje funkcijoje nurodo „B“ klasę. Taigi pirmiausia iškviečiamas „B“ klasės „konstruktorius ()“. Tada jis iškviečia „D“ klasės „konstruktorių ()“. Tada ištrinamas žymeklio objektas, kurį laiko „B“ ir „D“ klasių destruktoriai. Programoje neiškvietus „D“ klasės destruktoriaus, „B“ klasės rodyklė pašalina tik „B“ klasės naikintoją. Dėl to programos atmintis yra sugadinta.

Išvada

Aptarėme „Virtualios konstrukcijos“ sąvoką C++ programavime. Ištyrėme, kad negalime sukurti virtualaus konstruktoriaus C++, bet galime sukurti virtualų naikintuvą savo koduose. Čia mes parodėme, kas atsitiko, kai sukūrėme virtualųjį konstruktorių C++ programavime ir virtualaus naikintuvo veikimą mūsų koduose. Sužinojome, kad konstruktorius negali būti virtualus, bet galime sukurti virtualų naikintoją savo klasėje. Šiame vadove parodėme keletą pavyzdžių ir išsamiai paaiškinome šiuos kodus.