C++ virtualni konstruktor

C Virtualni Konstruktor



C++ nam ne olakšava konstruiranje virtualnih konstruktora jer nije moguće nadjačati konstruktor klase. Dakle, virtualizacija konstruktora je besmislena. Ne postoji koncept stvaranja virtualnog konstruktora u C++ programu, ali možemo stvoriti virtualni destruktor tamo. Također ga možemo definirati budući da se programiranje konstruktora u C++ ne može smatrati virtualnim jer kada se pozove konstruktor klase, memorija ne sadrži virtualnu tablicu što znači da nije stvoren virtualni pokazivač. Dakle, konstruktor bi trebao biti nevirtualan u svakom trenutku.

Međutim, virtualni destruktor bi mogao postojati. Ovdje ćemo pokazati što se događa kada kreiramo virtualni konstruktor u C++ kao i rad virtualnog destruktora umjesto virtualnog konstruktora.

Primjer 1:

Kreirajmo virtualni konstruktor i započnimo naš kod postavljanjem datoteke zaglavlja 'iostream'. Ova datoteka zaglavlja je za funkcije koje su u njoj deklarirane kao što su 'cin' i 'cout'. Nakon toga dodajemo prostor imena 'std', tako da ne možemo dodati ovaj 'std' uz svaku funkciju u našem kodu. Nakon toga, stvaramo klasu koja je osnovna klasa našeg koda s nazivom 'my_base', a zatim dodajemo 'public' za stvaranje virtualnog konstruktora.







Virtualni konstruktor ovdje se stvara postavljanjem ključne riječi 'virtualno'. Unutar ovog virtualnog konstruktora postavljamo naredbu 'cout'. Ispod toga stvaramo funkciju pod nazivom 'show' u kojoj ponovno koristimo 'cout'. Nakon toga, stvaramo izvedenu klasu ove osnovne klase s nazivom “my_derived” i zatim uspostavljamo “my_derived()” konstruktor u polju “public”. Umećemo naredbu “cout” u ovaj konstruktor “my_derived()”. Ispod njega konstruiramo funkciju pod nazivom 'show' gdje još jednom koristimo 'cout'.



Sada, nakon pozivanja “main()”, kreiramo pokazivač osnovne klase s imenom “my_ptr” i također kreiramo objekt izvedene klase koji je “Obj_d”. Nakon toga, dodjeljujemo adresu “Obj_d” “my_ptr”. Zatim pozivamo funkciju “show()” kroz “my_ptr”.



Kod 1:





#include
korištenjem imenski prostor std ;
razreda moja_baza
{
javnost :
virtualan moja_baza ( )
{
cout << 'Ovo je moja osnovna klasa' << endl ;
}
poništiti pokazati ( )
{
cout << 'funkcija prikazivanja osnovne klase' << endl ;
}
} ;
razreda moje_izvedeno : javnost moja_baza
{
javnost :
moje_izvedeno ( )
{
cout << 'Ovo je moja izvedena klasa' << endl ;
}
poništiti pokazati ( )
{
cout << 'pokaži funkciju izvedene klase' < pokazati ( ) ;
}

Izlaz:
Ovdje se prikazuje poruka o pogrešci koja kaže da se konstruktor ne može proglasiti virtualnim u C++ programiranju. Dakle, možemo vidjeti da nam C++ ne dopušta generiranje virtualnog konstruktora, ali možemo stvoriti virtualni destruktor.



Primjer 2:

Riješimo prethodni problem i stvorimo virtualni destruktor u ovom kodu. Nakon deklariranja klase “new_base”, postavljamo “public” konstruktor u koji stvaramo virtualni destruktor dodavanjem “virtual ~” uz “new_base”. U ovaj virtualni destruktor umećemo naredbu 'cout'. Ispod njega konstruiramo funkciju pod nazivom 'show' koja koristi 'cout'. Zatim izrađujemo izvedenu klasu koja je “new_derived” od ove “new_base” osnovne klase i konstruiramo “new_derived()” destruktor u polju “public”. Ovaj “new_derived()” destruktor sada ima dodan izraz “cout”.

Ispod njega stvaramo funkciju pod nazivom 'show' koja ponovno koristi naredbu 'cout'. Nakon poziva funkcije “main()”, sada proizvodimo objekt izvedene klase “obj_d” kao i pokazivač osnovne klase pod nazivom “ptr1”. Nakon toga, dajemo 'obj_d' adresu 'ptr1'. Zatim se poziva metoda “show()” pomoću “ptr1”.

Kod 2:

#include
korištenjem imenski prostor std ;
razreda nova_baza
{
javnost :
virtualan ~nova_baza ( )
{
cout << 'Destruktor osnovne klase je ovdje' << endl ;
}
poništiti pokazati ( )
{
cout << 'Funkcija prikazivanja osnovne klase' << endl ;
}
} ;
razreda novo_izvedeno : javnost nova_baza
{
javnost :
~novo_izvedeno ( )
{
cout << 'Destruktor izvedene klase je ovdje' << endl ;
}
poništiti pokazati ( )
{
cout << 'Funkcija prikazivanja osnovne klase' < pokazati ( ) ;
}

Izlaz:
Ovaj program koristi pokazivački objekt 'new_base' koji pokazuje na izvedenu klasu 'obj_d'. Stoga prvo poziva metodu “show()” klase “new_base”. Zatim poziva metodu “~new_derived()” klase “new_derived” i prikazuje “~new_base” osnovne klase.

Primjer 3:

Evo još jednog koda za generiranje 'virtualnog' konstruktora. Nakon uključivanja prostora imena 'iostream' i 'std', generiramo klasu 'B'. Ispod ovoga stvaramo 'javni' konstruktor koji je 'B()', a zatim generiramo 'cout'. Funkcije konstruktora i destruktora definirane su korištenjem 'javnog' specifikatora pristupa u kojem bilo koji objekt u klasi može pozvati.

Sada također stvaramo “~B()” destruktor ove osnovne klase u kojem ponovno koristimo “cout”. Zatim stvaramo klasu 'D' koja je izvedena klasa osnovne klase 'B' i ovdje postavljamo 'public'. Unutar ove 'javnosti' stvaramo konstruktor kao i destruktor izvedene klase s imenima 'D()' odnosno '~D'. Oba sadrže 'cout' u sebi. Sada imamo funkciju 'main()'. Nakon poziva ove funkcije, generiramo objekt pokazivača osnovne klase.

Zatim koristimo ključnu riječ 'delete' i ovdje postavljamo 'base_ptr'. U ovom slučaju, prostor destruktora se briše pozivanjem objekta pokazivača osnovne klase.

Kod 3:

#include
korištenjem imenski prostor std ;
razreda B
{
javnost :
B ( )
{
cout << 'Konstruktor osnovne klase' << endl ;
}
~B ( )
{
cout << 'Destruktor osnovne klase' << endl ;
}
} ;

razreda D : javnost B
{
javnost :
D ( )
{
cout << 'Konstruktor izvedene klase' << endl ;
}
~D ( )
{
cout << 'Destruktor izvedene klase' << endl ;
}
} ;
int glavni ( )
{
B * baza_ptr = novi D ;
izbrisati baza_ptr ;
}

Izlaz:
Rezultat pokazuje da koristi objekt pokazivača koji pokazuje na klasu 'B' u glavnoj funkciji. Dakle, prvo poziva “constructor()” klase “B”. Zatim poziva “constructor()” klase “D”. Objekt pokazivača koji drže destruktori klasa 'B' i 'D' tada se briše. Bez pozivanja destruktora klase “D” unutar programa, pokazivač klase “B” eliminira samo destruktor klase “B”. Kao rezultat toga, memorija programa je oštećena.

Zaključak

Razgovarali smo o konceptu 'virtualne konstrukcije' u C++ programiranju. Istražili smo da ne možemo stvoriti virtualni konstruktor u C++, ali možemo stvoriti virtualni destruktor u našim kodovima. Ovdje smo pokazali što se dogodilo kada smo stvorili virtualni konstruktor u C++ programiranju i rad virtualnog destruktora u našim kodovima. Naučili smo da konstruktor ne može biti virtualan, ali možemo generirati virtualni destruktor u našoj klasi. Demonstrirali smo neke primjere i temeljito objasnili te kodove u ovom vodiču.