Nie, wszystkie destruktory są domyślnie NIE wirtualne.
Trzeba będzie zdefiniować wirtualny destruktor na wszystkich klas bazowych
Poza tym.
Cytując Scott Meyers w swojej książce „Efektywne C++”:
The C++ language standard is unusually clear on this topic. When you try to delete a derived class object through a base class pointer and the base class has a non-virtual destructor (as EnemyTarget does), the results are undefined
W praktyce, jest to zwykle dobry pomysł, aby zdefiniować klasę z wirtualnego destruktora jeśli myślisz, że ktoś w końcu utworzyć klasę pochodną z tego. Mam tendencję do tego, aby wszystkie klasy miały wirtualny destruktor. Tak, wiąże się to z kosztem, ale kosztem tego, że nie jest on coraz częściej wirtualny, nie waży się marnego nakładu czasu pracy.
Proponuję tylko uczynić z niego nie-wirtualny, gdy jesteś absolutnie pewien, że chcesz go w ten sposób, a nie polegać na domyślnym, nie wirtualnym, który kompiluje wymuszenie. Możecie się nie zgadzać, jednak (podsumowując) Ostatnio miałem okropny wyciek pamięci na jakiś staroświecki kod, w którym wszystko, co zrobiłem, to dodanie std :: vector do jednej z klas, które istniały od kilku lat. Okazuje się, że jedna z jego klas bazowych nie ma zdefiniowanego destruktora (domyślny destruktor jest pusty, nie-wirtualny!) I jak żadna pamięć nie została przydzielona w ten sposób, zanim nie wycieknie do tego momentu. Wiele dni badań i czasu zmarnowane później ...
przy okazji, tylko zastanawiasz się, jaki jest domyślny destrutor? czy jest więcej niż jeden rodzaj destruktora? – user88637
@ yossi1981: jeśli nie zadeklarujesz destruktora w klasie, kompilator wstawi jeden dla ciebie. Ryzykując pomyłkę w niecodziennym przypadku, ten "domyślny destruktor" jest taki sam, jak gdybyś zdefiniował "~ MyClass() {}". –
@onebyone: to be precise: 'public: ~ MyClass() {}' - nawet jeśli członkowie klasy są domyślnie prywatni. – MSalters