Virtuálny konštruktor C++

Virtualny Konstruktor C



C++ nám neuľahčuje vytváranie virtuálnych konštruktorov, pretože nie je možné prepísať konštruktor triedy. Takže virtualizácia konštruktora nemá zmysel. Neexistuje žiadna koncepcia vytvorenia virtuálneho konštruktora v programe C++, ale môžeme vytvoriť virtuálny deštruktor tam. Môžeme ho tiež definovať, pretože programovanie konštruktora v C++ nemožno považovať za virtuálne, pretože keď je vyvolaný konštruktor triedy, pamäť neobsahuje žiadnu virtuálnu tabuľku, čo znamená, že nie je vytvorený žiadny virtuálny ukazovateľ. Konštruktor by teda mal byť vždy nevirtuálny.

Mohol by však existovať virtuálny deštruktor. Tu si ukážeme, čo sa stane, keď vytvoríme virtuálny konštruktor v C++, ako aj fungovanie virtuálneho deštruktora namiesto virtuálneho konštruktora.

Príklad 1:

Vytvorme virtuálny konštruktor a začnime náš kód umiestnením hlavičkového súboru „iostream“. Tento hlavičkový súbor je určený pre funkcie, ktoré sú v ňom deklarované ako „cin“ a „cout“. Potom pridáme menný priestor „std“, takže tento „std“ nemôžeme pridať ku každej funkcii v našom kóde. Potom vytvoríme triedu, ktorá je základnou triedou nášho kódu s názvom „my_base“ a potom pridáme „public“ na vytvorenie virtuálneho konštruktora.







Virtuálny konštruktor sa tu vytvorí umiestnením kľúčového slova „virtuálny“. Do tohto virtuálneho konštruktora umiestnime príkaz „cout“. Pod tým vytvoríme funkciu s názvom „show“, v ktorej opäť použijeme „cout“. Potom vytvoríme odvodenú triedu tejto základnej triedy s názvom „my_derived“ a potom vytvoríme konštruktor „my_derived()“ v poli „public“. Do tohto konštruktora „my_derived()“ vložíme príkaz „cout“. Pod ním vytvoríme funkciu nazvanú „show“, kde ešte raz použijeme „cout“.



Teraz, po vyvolaní „main()“, vytvoríme ukazovateľ základnej triedy s názvom „my_ptr“ a tiež vytvoríme objekt odvodenej triedy, ktorý je „Obj_d“. Potom priradíme adresu „Obj_d“ k „my_ptr“. Potom zavoláme funkciu „show()“ prostredníctvom „my_ptr“.



Kód 1:





#include
použitím menný priestor std ;
trieda moja_základňa
{
verejnosti :
virtuálne moja_základňa ( )
{
cout << 'Tu je moja základná trieda' << endl ;
}
neplatné šou ( )
{
cout << 'funkcia show základnej triedy' << endl ;
}
} ;
trieda moje_odvodené : verejnosti moja_základňa
{
verejnosti :
moje_odvodené ( )
{
cout << 'Tu je moja odvodená trieda' << endl ;
}
neplatné šou ( )
{
cout << 'funkcia show odvodenej triedy' < šou ( ) ;
}

Výkon:
Tu sa zobrazuje chybové hlásenie, ktoré hovorí, že konštruktor nemôže byť vyhlásený za virtuálny v programovaní C++. Takže vidíme, že C++ nám neumožňuje vygenerovať virtuálny konštruktor, ale môžeme vytvoriť virtuálny deštruktor.



Príklad 2:

Poďme vyriešiť predchádzajúci problém a vytvoriť virtuálny deštruktor v tomto kóde. Po deklarovaní triedy „new_base“ umiestnime „public“ konštruktor, do ktorého vytvoríme virtuálny deštruktor pridaním „virtual ~“ k „new_base“. Do tohto virtuálneho deštruktora vložíme príkaz „cout“. Pod ním vytvoríme funkciu s názvom „show“, ktorá využíva funkciu „cout“. Ďalej vytvoríme odvodenú triedu, ktorá je „new_derived“ tejto základnej triedy „new_base“ a vytvoríme deštruktor „new_derived()“ v poli „public“. Tento deštruktor „new_derived()“ má teraz pridaný príkaz „cout“.

Pod ním vytvoríme funkciu s názvom „show“, ktorá opäť používa príkaz „cout“. Po zavolaní funkcie „main()“ teraz vytvoríme objekt odvodenej triedy „obj_d“, ako aj ukazovateľ základnej triedy s názvom „ptr1“. Potom dáme adresu „obj_d“ do „ptr1“. Ďalej sa metóda „show()“ vyvolá pomocou „ptr1“.

Kód 2:

#include
použitím menný priestor std ;
trieda new_base
{
verejnosti :
virtuálne ~nová_základňa ( )
{
cout << 'Deštruktor základnej triedy je tu' << endl ;
}
neplatné šou ( )
{
cout << 'Zobrazovacia funkcia základnej triedy' << endl ;
}
} ;
trieda new_derived : verejnosti new_base
{
verejnosti :
~new_derived ( )
{
cout << 'Deštruktor odvodených tried je tu' << endl ;
}
neplatné šou ( )
{
cout << 'Zobrazovacia funkcia základnej triedy' < šou ( ) ;
}

Výkon:
Tento program používa objekt ukazovateľa „new_base“, ktorý ukazuje na odvodenú triedu „obj_d“. Najprv teda zavolá metódu „show()“ triedy „new_base“. Potom zavolá metódu „~new_derived()“ triedy „new_derived“ a zobrazí „~new_base“ základnej triedy.

Príklad 3:

Tu je ďalší kód na vygenerovanie „virtuálneho“ konštruktora. Po zahrnutí priestoru názvov „iostream“ a „std“ vygenerujeme triedu „B“. Pod tým vytvoríme „verejný“ konštruktor, ktorý je „B()“ a potom vygenerujeme „cout“. Funkcie konštruktora a deštruktora sú definované použitím špecifikátora „verejného“ prístupu, v ktorom môže volať akýkoľvek objekt v triede.

Teraz tiež vytvoríme deštruktor „~B()“ tejto základnej triedy, v ktorom opäť použijeme „cout“. Potom vytvoríme triedu „D“, ktorá je odvodenou triedou základnej triedy „B“, a umiestnime sem „public“. Vo vnútri tejto „verejnosti“ vytvoríme konštruktor aj deštruktor odvodenej triedy s názvami „D()“ a „~D“. Obe obsahujú v sebe „cout“. Teraz máme funkciu „main()“. Po zavolaní tejto funkcie vygenerujeme pointer objekt základnej triedy.

Potom použijeme kľúčové slovo „delete“ a sem umiestnime „base_ptr“. V tomto prípade sa priestor deštruktora vymaže volaním objektu ukazovateľa základnej triedy.

Kód 3:

#include
použitím menný priestor std ;
trieda B
{
verejnosti :
B ( )
{
cout << 'Konštruktor základnej triedy' << endl ;
}
~B ( )
{
cout << 'Deštruktor základnej triedy' << endl ;
}
} ;

trieda D : verejnosti B
{
verejnosti :
D ( )
{
cout << 'Konštruktor odvodenej triedy' << endl ;
}
~D ( )
{
cout << 'Deštruktor odvodenej triedy' << endl ;
}
} ;
int Hlavná ( )
{
B * base_ptr = Nový D ;
vymazať base_ptr ;
}

Výkon:
Výsledok ukazuje, že používa objekt ukazovateľa, ktorý ukazuje na triedu „B“ v hlavnej funkcii. Najprv teda volá „konštruktor()“ triedy „B“. Potom zavolá „constructor()“ triedy „D“. Objekt ukazovateľa, ktorý držia deštruktory tried „B“ a „D“, sa potom vymaže. Bez vyvolania deštruktora triedy „D“ v rámci programu, ukazovateľ triedy „B“ eliminuje iba deštruktor triedy „B“. V dôsledku toho je poškodená pamäť programu.

Záver

Diskutovali sme o koncepte „virtuálnej konštrukcie“ v programovaní v C++. Zistili sme, že nemôžeme vytvoriť virtuálny konštruktor v C++, ale môžeme vytvoriť virtuálny deštruktor v našich kódoch. Tu sme ukázali, čo sa stalo, keď sme vytvorili virtuálny konštruktor v programovaní C++ a fungovanie virtuálneho deštruktora v našich kódoch. Dozvedeli sme sa, že konštruktor nemôže byť virtuálny, ale môžeme virtuálny deštruktor vygenerovať v našej triede. V tejto príručke sme predviedli niekoľko príkladov a tieto kódy dôkladne vysvetlili.