O Sr. Lidström e eu tivemos uma discussão :)
A alegação do Sr. Lidström é que uma construção shared_ptr<Base> p(new Derived);
não exige que a Base tenha um destruidor virtual:
Armen Tsirunyan : "Sério? O shared_ptr será limpo corretamente? Você poderia, neste caso, demonstrar como esse efeito poderia ser implementado?"
Daniel Lidström : "O shared_ptr usa seu próprio destruidor para excluir a instância Concreta. Isso é conhecido como RAII na comunidade C ++. Meu conselho é que você aprenda tudo que puder sobre RAII. Isso tornará sua codificação C ++ muito mais fácil quando você usar RAII em todas as situações. "
Armen Tsirunyan : "Eu sei sobre RAII e também sei que, eventualmente, o destruidor shared_ptr pode excluir o px armazenado quando pn atingir 0. Mas se px tiver um ponteiro de tipo estático para
Base
e um ponteiro de tipo dinâmico paraDerived
, a menos queBase
tenha um destruidor virtual, isso resultará em comportamento indefinido. Corrija-me se eu estiver errado. "Daniel Lidström : "O shared_ptr sabe que o tipo estático é concreto. Ele sabe disso desde que o passei em seu construtor! Parece um pouco mágico, mas posso garantir que é intencional e extremamente bom."
Então, nos julgue. Como é possível (se for) implementar shared_ptr sem exigir que as classes polimórficas tenham um destruidor virtual? desde já, obrigado