Virtuální konstruktor C++

Virtualni Konstruktor C



C++ nám neusnadňuje vytváření virtuálních konstruktorů, protože není možné přepsat konstruktor třídy. Virtualizace konstruktoru je tedy bezvýznamná. Neexistuje žádný koncept vytvoření virtuálního konstruktoru v programu C++, ale můžeme vytvořit virtuální destruktor tam. Můžeme to také definovat, protože programování konstruktoru v C++ nelze považovat za virtuální, protože když je vyvolán konstruktor třídy, paměť neobsahuje žádnou virtuální tabulku, což znamená, že není vytvořen žádný virtuální ukazatel. Konstruktor by tedy měl být vždy nevirtuální.

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:

#include
použ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:

#include
použ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.