Kurs C++
Wirtualne destruktory
[lekcja] Działanie wirtualnych destruktorów w praktyce - znaczenie słowa kluczowego virtual.Wirtualne destruktory należy stosować w klasach bazowych, które mogą być dziedziczone przez inne klasy. Destruktor wirtualny w klasie bazowej zapewnia wywołanie wszystkich destruktorów klas potomnych podczas niszczenia obiektu. Należy pamiętać, że ideą destruktorów jest zwalnianie zasobów, które zostały przydzielone w czasie pracy z obiektem. Niewywołanie destruktora może prowadzić więc do wycieków pamięci, a w konsekwencji do krytycznego błędu pisanej aplikacji. Słowo kluczowe
virtual przy destruktorze klasy bazowej zapewnia wywołanie wszystkich destruktorów klas pochodnych, które dziedziczą po danej klasie bazowej.
Przykład
#include <cstdio>
class CBazowa
{
public:
CBazowa();
virtual ~CBazowa();
};
class CPochodna
: public CBazowa
{
public:
CPochodna();
~CPochodna();
};
int main()
{
CBazowa * pBase = new CPochodna;
delete pBase;
return 0;
}
CBazowa::CBazowa()
{
printf( "CBazowa()\n" );
}
CBazowa::~CBazowa()
{
printf( "~CBazowa()\n" );
}
CPochodna::CPochodna()
{
printf( "CPochodna()\n" );
}
CPochodna::~CPochodna()
{
printf( "~CPochodna()\n" );
}
Standardowe wyjście programu:
CBazowa()
CPochodna()
~CPochodna()
~CBazowa()
Modyfikacja programu
Jeżeli w powyższym kodzie zmodyfikujemy destruktor bazowy tak, aby nie był wirtualny, to destruktor klasy pochodnej nie zostanie wywołany. Fragment kodu, który uległ modyfikacji:
class CBazowa
{
public:
CBazowa();
~CBazowa();
};
Efekt działania programu po modyfikacji kodu:
CBazowa()
CPochodna()
~CBazowa()
Wszystkie teksty są chronione prawami autorskimi. Kopiowanie lub rozpowszechnianie treści poza niniejszym serwisem
jest zabronione.
Powyższe ograniczenie nie dotyczy autora opracowania, któremu przysługuje prawo do rozpowszechniania własnego tekstu wedle własnego uznania.