In linea di massima è consentito derivare dalle classi STL, vedere here e here. Tuttavia, è necessario essere consapevoli del fatto che non si dovrebbe lavorare con un puntatore alla classe base, ad esempio uno std::shared_ptr<myotherclass>*
in questo caso.
Quindi questo e loro varianti dovrebbe essere vietato:
std::shared_ptr<myotherclass>* ptr = new myclass(/* ... */);
... ma ha accettato, che sembra un po 'sintetico.
Perché è vietato? Perché le classi STL non hanno un distruttore virtuale. Pertanto, quando si desidera che la classe allocata sia delete
, la parte derivata rimane. Ciò a sua volta invoca undefined behaviour ed eventualmente crea una perdita di memoria, anche se non si dispone di alcune allocazioni nella classe derivata.
Per fare ciò, una possibilità è quella di ricavare privatamente da shared_ptr
:
class myclass : private std::shared_ptr<myotherclass> {};
^^^^^^^
Questo però potrebbe portare a problemi con la compatibilità binaria, vedere i commenti a this answer.
Alla mano, anche se il primo è consentito, si può andare con meno soggetto a errori e sia per uso composizione, in cui si effettua la shared_ptr
un membro di myclass
ed esporre la funzionalità richiesta (con l'inconveniente che a volte hanno per esporre molto). Oppure puoi impostare una funzione autonoma che fa quello che vuoi ... Lo so che lo sapevi ;-)
Cosa c'è di così buono nel fare qualcosa del genere? – Drax
Nella maggior parte dei casi dovresti essere in grado di descrivere la relazione di ereditarietà con la fase inglese "è un". Quindi nel caso precedente quello che stai dicendo è: myclass "è un" std :: shared_ptr. Questo probabilmente non è quello che intendi. –
Non è "cattivo" tanto quanto "strano". Sicuramente questo dovrebbe essere un membro di 'myotherclass' stesso (o forse un non-membro che agisce su' myotherclass'), non qualcosa di imbullonato a qualche specifico tipo di puntatore intelligente? –