El Sr. Lidström y yo tuvimos una discusión :)
La afirmación del Sr. Lidström es que una construcción shared_ptr<Base> p(new Derived);
no requiere que Base tenga un destructor virtual:
Armen Tsirunyan : "¿En serio? ¿El shared_ptr se limpiará correctamente? ¿Podrías demostrar en este caso cómo se podría implementar ese efecto?"
Daniel Lidström : "El shared_ptr usa su propio destructor para eliminar la instancia de Concrete. Esto se conoce como RAII dentro de la comunidad C ++. Mi consejo es que aprenda todo lo que pueda sobre RAII. Hará que su codificación C ++ sea mucho más fácil cuando use RAII en todas las situaciones ".
Armen Tsirunyan : "Sé acerca de RAII, y también sé que eventualmente el destructor shared_ptr puede eliminar el px almacenado cuando pn llega a 0. Pero si px tuviera un puntero de tipo estático
Base
y un puntero de tipo dinámicoDerived
, entonces a menos queBase
tenga un destructor virtual, esto resultará en un comportamiento indefinido. Corrígeme si me equivoco ".Daniel Lidström : "El shared_ptr sabe que el tipo estático es Concrete. ¡Lo sabe desde que lo pasé en su constructor! Parece un poco mágico, pero puedo asegurarles que es por diseño y extremadamente agradable".
Entonces, juzgadnos. ¿Cómo es posible (si lo es) implementar shared_ptr sin requerir que las clases polimórficas tengan un destructor virtual? Gracias por adelantado