ďťż

Ładny brzuch

Witam :)
Wiem, że jeśli jakaś metoda w klasie będzie wirtualna to destruktor także powinien być wirtualny. Tylko nie wiem czy trzeba go jawnie deklarować czy zrobi to za mnie kompilator(oczywiście mowa o wirtualnym destruktorze a nie zwykłym)



Czemu powinien? To wszystko zależy :) Ale musisz zaznaczyć to jawnie o ile dobrze pamiętam.


Czemu powinien? To wszystko zależy :) Ale musisz zaznaczyć to jawnie o ile dobrze pamiętam.

Tak jeżeli masz w klasie jakąś metode wirtualną to powinieneś mieć też destruktor poprzedzony słowem virtual. Kompilator sam tego Ci nie doda.



A czy mógłby mi ktoś jeszcze wytłumaczyć dlaczego obiekt zostanie źle zniszczony jeśli destruktor nie będzie wirtualny? (bo z książki nie mogłem zrozumieć :P )
Za poświęcenie dziękuję :)

Powinieneś dlatego, że jeśli budujesz klasę z funkcją wirtualną to znaczy, że planujesz jej dziedziczenie. Natomiast przy braku wirtualnego destruktora, operacja
delete wskaznikNaObiekt;
powoduje wywołanie destruktora klasy o takim typie, jakiego typu jest wskaźnik wskaznikNaObiekt [czyli najczęściej klasy podstawowej], a nie destruktora z klasy, której obiekt jest na prawdę pod tym wskaźnikiem. A destruktorów zazwyczaj używamy do sprzątania, to nie wywołanie prawidłowego destruktora może mieć katastrofalne skutki.

Ale nie ma takiego obowiązku, więc kompilator Ci nic nie zasygnalizuje.
Pozdrawiam,
TeMPOraL.

bardzo, bardzo dzięki TeMPOraL. Wreszcie zrozumiałem. :)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •