« Wirtualne destruktory, lekcja »
Działanie wirtualnych destruktorów w praktyce - znaczenie słowa kluczowego virtual. (lekcja)
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!
Autor: Piotr Szawdyński
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

C/C++
#include <cstdio>

class CBazowa
{
public:
    CBazowa();
    virtual ~CBazowa();
}; //class CBazowa

class CPochodna
    : public CBazowa
{
public:
    CPochodna();
    ~CPochodna();
}; //class CPochodna

int main()
{
    CBazowa * pBase = new CPochodna;
    delete pBase;
    return 0;
}


CBazowa::CBazowa()
{
    printf( "CBazowa()\n" );
}

//virtual
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:
C/C++
class CBazowa
{
public:
    CBazowa();
    ~CBazowa();
}; //class CBazowa
Efekt działania programu po modyfikacji kodu:
CBazowa()
CPochodna()
~CBazowa()
Poprzedni dokumentNastępny dokument
Metody wirtualne w konstruktorachWskaźnik na funkcję