Temat: Wirtualny destruktor (Liczba/Waluta)

Jeżeli tworzymy tylko obiekty klas pochodnych, czy to statycznie czy dynamicznie:

Waluta w1;
Waluta* w2 = new Waluta("PLN", 1.0, 0.0, 3);

To w momencie ich usuwania z pamięci będzie uruchamiany zarówno destruktor klasy pochodnej, jak i destruktor klasy bazowej:

Wywołano destruktor klasy Waluta
Wywołano destruktor klasy Liczba

Więc nie zauważymy żadnego wpływu tego, czy destruktor zadeklarujemy jako wirtualny czy nie.

Możemy to zauważyć dopiero w sytuacji, gdy korzystamy ze wskaźników.

Ponieważ zmienna zadeklarowana jako wskaźnik na obiekt klasy bazowej może wskazywać również na obiekty klas pochodnych, możemy zrobić tak:

Liczba* wsk = new Waluta("PLN", 1.0, 0.0, 3);

Ale wówczas, jeżeli chcemy usunąć stworzony w ten sposób obiekt:

delete wsk;

Zostanie wywołany tylko destruktor z klasy Liczba:

Wywołano destruktor klasy Liczba

Aby wywołany został również destruktor z klasy Waluta, należy w klasie Liczba zadeklarować destruktor jako wirtualny:

virtual ~Liczba();

Teraz już destruktory zostaną wywołane poprawnie:

Wywołano destruktor klasy Waluta
Wywołano destruktor klasy Liczba

Zachęcam do przetestowania tego we własnym programie.

Inny przykład: Wirtualne destruktory