Wie implementiere ich Polymorphie mit std :: shared_ptr?

8

Ich habe einige der anderen Fragen zu diesem Thema gesehen, habe aber immer noch keine Antwort gefunden - ich denke ich vermisse etwas:

Ich habe zwei einfache Testklassen definiert:

%Vor%

Ich habe typedefs deklariert, um ihre Verwendung mit std::shared_ptr:

zu vereinfachen %Vor%

Problem: Ich kann Code nicht kompilieren, um diese shared_ptr -Deklarationen polymorph zu verwenden, obwohl base in allen diesen Fällen tatsächlich eine Instanz von spDerived ist:

%Vor%      

error: keine passende Funktion für den Aufruf von 'std :: shared_ptr :: shared_ptr (spBase & amp;)

%Vor%      

Fehler: Kann 'based' (vom Typ 'spBase {aka class std :: shared_ptr}') nicht 'spDerived {aka class' eingeben   std :: shared_ptr} '(Ziel ist kein Zeiger oder Verweis)

%Vor%      

Fehler: Konvertierung von 'std :: shared_ptr & gt;' in nicht-skalaren Typ   'SpDerived {aka std :: shared_ptr}' angefordert

%Vor%      

Fehler: Konvertierung von 'std :: shared_ptr & gt;' in nicht-skalaren Typ   'SpDerived {aka std :: shared_ptr}' angefordert

Ich verwende C ++ 11 in einer Ubuntu 14.04-Box mit der Standard-GCC-Tool-Kette. Compiler ist gcc-4.9. Was mache ich falsch? Kann ein shared_pointer nicht polymorph verwendet werden?

    
Vector 16.12.2014, 10:53
quelle

1 Antwort

13

Ein Typ, der an std::static_pointer_cast und std::dynamic_pointer_cast als erstes Typ-Template-Argument ist der Typ des konvertierten Zeigertyps selbst, nicht der Smart Zeigertyp:

%Vor%

Wenn Sie das sagen, können Sie es wie folgt nennen:

%Vor%     
Piotr Skotnicki 16.12.2014, 11:08
quelle