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
Basei dynamiczny wskaźnik typu doDerived, to jeśli nieBasema 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ę