baza2()
cout« "konstruktor baza2\n";
virtual ~baza2()
cout« "destruktor baza2\n”;
};
class Pochodna2 : public baza2
public:
~Pochodna2()
cout« "destruktor Pochodna2\n";
};
Jeśli spodziewamy się, że kiedyś nasza klasa będzie dziedziczona, to destruktor musi być wirtualny. Jeśli nie planujemy utworzenia destmktora, bo nie ma nic do usunięcia, to lepiej jednak dodać wirtualny destruktor niezawierający kodu.
Po co to wszystko? Pamiętajmy, że możemy używać wskaźników do klas podstawowych w celu manipulowania klasami pochodnymi. Rozważmy klasę Pochodna2 pokazaną we fragmencie „Przed”. Jak widzimy, dziedziczy ona po klasie baza2. Rozważmy kod:
Pochodna2 *pd2; pd2 = new Pochodna2; delete pd2;
Tworzymy tutaj i usuwamy wskaźnik do klasy pochodnej. Wszystko zadziała bezbłędnie, zostanie usunięta zarówno klasa pochodna, jak i klasa podstawowa.
A załóżmy, że użyjemy kodu:
Pochodna2 *pd2; baza2 *pdb; pd2 = new Pochodna2; pdb = (baza2 *) pd2; delete pdb;
W tym nowym kodzie rzutujemy wskaźnik na klasę podstawową i usuwamy go. Destruktor jednakże nie jest wirtualny. A zatem zostaje wywołany tylko destruktor dla klasy podstawowej (baza2), ale destmktor dla wskazywanej klasy pochodnej (Pochodna2) nie zostanie wywołany. Niedobrze!