M. Lidström et moi nous sommes disputés :)
L'affirmation de M. Lidström est qu'une construction shared_ptr<Base> p(new Derived);
ne nécessite pas que Base ait un destructeur virtuel:
Armen Tsirunyan : "Vraiment? Le shared_ptr nettoiera-t-il correctement? Pourriez-vous s'il vous plaît dans ce cas démontrer comment cet effet pourrait être mis en œuvre?"
Daniel Lidström : "Le shared_ptr utilise son propre destructeur pour supprimer l'instance Concrete. Ceci est connu sous le nom de RAII dans la communauté C ++. Mon conseil est que vous appreniez tout ce que vous pouvez sur RAII. Cela rendra votre codage C ++ tellement plus facile lorsque vous l'utiliserez RAII dans toutes les situations. "
Armen Tsirunyan : "Je connais RAII, et je sais aussi que finalement le destructeur shared_ptr peut supprimer le px stocké lorsque pn atteint 0. Mais si px avait un pointeur de type statique vers
Base
et un pointeur de type dynamique versDerived
, alors à moins d'Base
avoir un destructeur virtuel, cela entraînera un comportement indéfini. Corrigez-moi si je me trompe. "Daniel Lidström : "Le shared_ptr sait que le type statique est Concrete. Il le sait depuis que je l'ai passé dans son constructeur! Cela semble un peu magique, mais je peux vous assurer que c'est par conception et extrêmement agréable."
Alors, jugez-nous. Comment est-il possible (si c'est le cas) d'implémenter shared_ptr sans exiger que les classes polymorphes aient un destructeur virtuel? Merci d'avance