Pan Lidström i ja pokłóciliśmy się :)
Pan Lidström twierdzi, że konstrukcja shared_ptr<Base> p(new Derived);
nie wymaga, aby Base miał wirtualnego destruktora:
Armen Tsirunyan : "Naprawdę? Czy shared_ptr wyczyści się poprawnie? Czy mógłbyś w tym przypadku zademonstrować, jak można zaimplementować ten efekt?"
Daniel Lidström : „ Shared_ptr używa własnego destruktora do usunięcia instancji Concrete. W społeczności C ++ jest to znane jako RAII. Moja rada jest taka, że nauczysz się wszystkiego o RAII. Dzięki temu kodowanie w C ++ będzie o wiele łatwiejsze, gdy będziesz używać RAII we wszystkich sytuacjach. "
Armen Tsirunyan : "Wiem o RAII i wiem również, że ostatecznie destruktor shared_ptr może usunąć zapisane piksele, gdy pn osiągnie 0. Ale jeśli px miałby statyczny wskaźnik typu do
Base
i dynamiczny wskaźnik typu doDerived
, to jeśli nieBase
ma wirtualnego destruktora, to spowoduje niezdefiniowane zachowanie. Popraw mnie, jeśli się mylę ”.Daniel Lidström : " Shared_ptr wie, że typ statyczny to Beton. Wie o tym, odkąd przekazałem go w jego konstruktorze! Wygląda trochę jak magia, ale mogę zapewnić, że jest to zgodne z projektem i niezwykle ładne."
Więc osądź nas. Jak jest możliwe (jeśli jest) zaimplementowanie shared_ptr bez wymagania, aby klasy polimorficzne miały wirtualny destruktor? Z góry dziękuję