2016-04-07 11 views
2

Wenn class B ergibt sich aus class A, kann ich dynamic_cast ein shared_ptr<B> zu einem shared_ptr<A> und von shared_ptr<A> zu einem shared_ptr<B>?Casting smartpointers auf Basisklasse

Ich frage mich nur, denn mit einem dynamic cast können Sie so etwas wie instanceof in Java tun. Und ich habe mich gefragt, ob das auch für smart_ptr funktioniert.

+0

Verwandte: http://stackoverflow.com/questions/19932629/implicit-conversion- von-geteilten-ptr –

Antwort

4

Für den speziellen Fall des Umwandelns von einer abgeleiteten Klasse in eine Basisklasse stehen Zuweisungsoperatoren zur Verfügung, die die erforderliche implizite Konvertierung für Sie durchführen. Für die andere Richtung können Sie dynamic_pointer_cast verwenden.

#include <memory> 

struct A { virtual ~A() = 0; }; 
struct B: A { }; 

void example() 
{ 
    // derived to base 
    std::shared_ptr<B> b; 
    std::shared_ptr<A> a = b; 

    // base to derived 
    std::shared_ptr<A> a2; 
    std::shared_ptr<B> b2 = std::dynamic_pointer_cast<B>(a2); 
} 

Siehe http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast für weitere Informationen über Operationen Gießen - es gibt Mittel für alle üblichen Verdächtigen wie reinterpret_pointer_cast usw.