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