Polymorphie mit smarten Zeigern



  • Ich versuche Folgendes:

    using namespace boost;
    
    class IA
    {
       virtual void helloWorld();
    }
    
    class B: public IA
    {
       void helloWorld();
    }
    class C
    {
        C(shared_ptr<IA> a);
    }
    
    int main
    {
      shared_ptr<IA> interfacePtr(new B);
      shared_ptr<B> pointerToB(interfacePtr); // hier gibts natürlich ein Problem
      shared_ptr<C> c(new C(interfacePtr));
    }
    

    Das funktioniert so nicht, denn für den prep sind IA und B ja nicht verwandt.

    Ich hab betreffende Zeile nach etwas Recherche in das hier geändert:

    shared_ptr<B> pointerToB(boost::dynamic_pointer_cast<B>(interfacePtr));
    

    Jetzt bin ich aber mit boost und den shared_ptrn noch nicht so versiert um zu wissen ob das wirklich so geht.
    Ist das OK so?

    Mit VC++2005 compilierts zumindest.



  • Hi,

    du versuchst hier ein DownCast zu machen, was nicht implizit funktioniert, denn wer gewährleistet dir denn, dass da auch wirklich die gewünschte abgeleitete Klasse drin steckt.

    // Hier wird versucht, einem B* eine A* zuzuweisen
    shared_ptr<B> pointerToB(interfacePtr);
    

    Die funktioniert nur bei einem UpCast implizit.
    Wieso willst du das eigentlich machen ? Polymorphie erreichst du genau auf dem umgekehrten Wege, also in A* B* reinstecken.



  • Jetzt bin ich aber mit boost und den shared_ptrn noch nicht so versiert um zu wissen ob das wirklich so geht.
    Ist das OK so?

    Mehr oder weniger. Zunächst, wenn du dir nicht sicher bist, solltest du vorher überprüfen, dass der Pointer nicht leer ist, das passiert wenn es sich ursprünglich nicht um ein B gehandelt hat.
    Also gehen tuts schon, gut ist es nicht, aber ich habs auch grad gemacht 🤡


Anmelden zum Antworten