Mohl by však existovat virtuální destruktor. Zde si ukážeme, co se stane, když vytvoříme virtuální konstruktor v C++, a také fungování virtuálního destruktoru místo virtuálního konstruktoru.
Příklad 1:
Vytvořme virtuální konstruktor a začněme náš kód umístěním hlavičkového souboru „iostream“. Tento hlavičkový soubor je určen pro funkce, které jsou v něm deklarovány jako „cin“ a „cout“. Poté přidáme jmenný prostor „std“, takže tento „std“ nemůžeme přidat ke každé funkci v našem kódu. Poté vytvoříme třídu, která je základní třídou našeho kódu s názvem „my_base“ a poté přidáme „public“ pro vytvoření virtuálního konstruktoru.
Zde se vytvoří virtuální konstruktor umístěním klíčového slova „virtuální“. Uvnitř tohoto virtuálního konstruktoru vložíme příkaz „cout“. Pod tím vytvoříme funkci s názvem „show“, ve které opět použijeme „cout“. Poté vytvoříme odvozenou třídu této základní třídy s názvem „my_derived“ a poté vytvoříme konstruktor „my_derived()“ v poli „public“. Do tohoto konstruktoru „my_derived()“ vložíme příkaz „cout“. Pod ním vytvoříme funkci nazvanou „show“, kde znovu použijeme „cout“.
Nyní, po vyvolání „main()“, vytvoříme ukazatel na základní třídu s názvem „my_ptr“ a také vytvoříme objekt odvozené třídy, který je „Obj_d“. Poté přiřadíme adresu „Obj_d“ k „my_ptr“. Poté zavoláme funkci „show()“ prostřednictvím „my_ptr“.
Kód 1:
#include
použitím jmenný prostor std ;
třída moje_základna
{
veřejnost :
virtuální moje_základna ( )
{
cout << 'Tady je moje základní třída' << endl ;
}
prázdnota ukázat ( )
{
cout << 'funkce show základní třídy' << endl ;
}
} ;
třída můj_odvozený : veřejnost moje_základna
{
veřejnost :
můj_odvozený ( )
{
cout << 'Tady je moje odvozená třída' << endl ;
}
prázdnota ukázat ( )
{
cout << 'funkce show odvozené třídy' < ukázat ( ) ;
}
Výstup:
Zde se zobrazí chybová zpráva, která říká, že konstruktor nemůže být v programování C++ prohlášen za virtuální. Takže vidíme, že C++ nám neumožňuje generovat virtuální konstruktor, ale můžeme vytvořit virtuální destruktor.
Příklad 2:
Pojďme vyřešit předchozí problém a vytvořit virtuální destruktor v tomto kódu. Po deklaraci třídy „new_base“ umístíme konstruktor „public“, do kterého vytvoříme virtuální destruktor přidáním „virtual ~“ k „new_base“. Do tohoto virtuálního destruktoru vložíme příkaz „cout“. Pod ním vytvoříme funkci nazvanou „show“, která využívá „cout“. Dále vytvoříme odvozenou třídu, která je „new_derived“ této základní třídy „new_base“, a vytvoříme destruktor „new_derived()“ v poli „public“. Tento destruktor „new_derived()“ má nyní přidaný příkaz „cout“.
Pod ním vytvoříme funkci nazvanou „show“, která opět používá příkaz „cout“. Po zavolání funkce „main()“ nyní vytvoříme objekt odvozené třídy „obj_d“ a také ukazatel základní třídy s názvem „ptr1“. Poté přiřadíme adresu „obj_d“ „ptr1“. Dále je vyvolána metoda „show()“ pomocí „ptr1“.
Kód 2:
#includepoužitím jmenný prostor std ;
třída nová_základna
{
veřejnost :
virtuální ~nová_základna ( )
{
cout << 'Destruktor základní třídy je tady' << endl ;
}
prázdnota ukázat ( )
{
cout << 'Funkce show základní třídy' << endl ;
}
} ;
třída nový_odvozený : veřejnost nová_základna
{
veřejnost :
~new_derived ( )
{
cout << 'Destruktor odvozených tříd je tady' << endl ;
}
prázdnota ukázat ( )
{
cout << 'Funkce show základní třídy' < ukázat ( ) ;
}
Výstup:
Tento program používá objekt ukazatele „new_base“, který ukazuje na odvozenou třídu „obj_d“. Nejprve tedy volá metodu „show()“ třídy „new_base“. Poté zavolá metodu „~new_derived()“ třídy „new_derived“ a zobrazí „~new_base“ základní třídy.
Příklad 3:
Zde je další kód pro generování „virtuálního“ konstruktoru. Po zahrnutí jmenného prostoru „iostream“ a „std“ vygenerujeme třídu „B“. Pod tím vytvoříme „veřejný“ konstruktor, který je „B()“ a poté vygenerujeme „cout“. Funkce konstruktoru a destruktoru jsou definovány pomocí „veřejného“ specifikátoru přístupu, ve kterém může volat jakýkoli objekt ve třídě.
Nyní také vytvoříme destruktor „~B()“ této základní třídy, ve kterém opět použijeme „cout“. Poté vytvoříme třídu „D“, která je odvozenou třídou základní třídy „B“, a zde umístíme „public“. Uvnitř této „veřejnosti“ vytvoříme konstruktor a také destruktor odvozené třídy s názvy „D()“ a „~D“. Oba v sobě obsahují „cout“. Nyní máme funkci „main()“. Po zavolání této funkce vygenerujeme objekt ukazatele základní třídy.
Poté použijeme klíčové slovo „delete“ a zde umístíme „base_ptr“. V tomto případě je prostor destruktoru odstraněn voláním objektu ukazatele základní třídy.
Kód 3:
#includepoužitím jmenný prostor std ;
třída B
{
veřejnost :
B ( )
{
cout << 'Konstruktor základní třídy' << endl ;
}
~B ( )
{
cout << 'Destruktor základní třídy' << endl ;
}
} ;
třída D : veřejnost B
{
veřejnost :
D ( )
{
cout << 'Konstruktor odvozené třídy' << endl ;
}
~D ( )
{
cout << 'Destruktor odvozené třídy' << endl ;
}
} ;
int hlavní ( )
{
B * základní_ptr = Nový D ;
vymazat základní_ptr ;
}
Výstup:
Výsledek ukazuje, že používá objekt ukazatele, který ukazuje na třídu „B“ v hlavní funkci. Nejprve tedy volá „constructor()“ třídy „B“. Poté zavolá „constructor()“ třídy „D“. Objekt ukazatele, který je držen destruktory tříd „B“ a „D“, je poté odstraněn. Bez vyvolání destruktoru třídy „D“ v programu ukazatel třídy „B“ eliminuje pouze destruktor třídy „B“. V důsledku toho je poškozena paměť programu.
Závěr
Diskutovali jsme o konceptu „virtuální konstrukce“ v programování v C++. Zjistili jsme, že nemůžeme vytvořit virtuální konstruktor v C++, ale můžeme vytvořit virtuální destruktor v našich kódech. Zde jsme ukázali, co se stalo, když jsme vytvořili virtuální konstruktor v programování C++ a jak funguje virtuální destruktor v našich kódech. Zjistili jsme, že konstruktor nemůže být virtuální, ale můžeme virtuální destruktor vygenerovat v naší třídě. V této příručce jsme předvedli několik příkladů a tyto kódy důkladně vysvětlili.