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:
#includepouž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:
#includepouž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.