C++ Problem (Vererbung und andere schöne sachen :-D)



  • Hallo Leude ;-),

    also es kann sein das ich ganz schön auf dem schlauch stehe, aber ich fang einfach mal an mein Problem zu beschreiben 😃 ... ^^

    nun angenommen wir haben eine Klasse A und eine Klasse B die wie folgt definiert sind :

    template<class T>
    class A
    {
        public:
            void fkt1(){cout << "fkt1" << endl;}
    }
    
    template<class T>
    class B : public A
    {
        public:
            void fkt2(){cout << "fkt2" << endl;}
    }
    

    nun möchte aus einem bestehendem Objekt A ein Objekt B machen.
    also im Prinzip Objekt A ersetzen durch Objekt B.

    folgendes soll also funktionieren(es funktioniert nicht deswegen schreib ich hier, es geht um die funktionsweisse die ich haben will ;-))

    A<Klasse> a;
    B<Klasse> *b;
    
    b = &a;
    b->fkt2();
    

    Ich hab schon alle möglichen cast's probiert, ohne erfolg. Ist ja auch klar a ist ebend kein B, demnach existiert fkt2() nicht in a.

    wie gesagt ich will das b, a repräsentiert. und wenn an a änderungen vorgenommen werden diese bei b bemerkbar sind / auch gemacht wreden.

    ach ja zusätzliches problem ist das ich die quellen von A nicht gegeben habe, sie also nicht verändern darf.

    Das anliegen dahinter ist ein GUI frontend für ein simulationsframework.

    Auch wenn meine beschreibungen hier bisschen wage sind, hoffe ich das ich hier hilfe kriege. Wenn ihr mehr infos braucht einfach frage ;-).

    gruß c0d3x



  • du brauchst einen upcast...

    ist kein schönes design sondern eher dreckig und langsam:

    A<Klasse> a;
    B<Klasse> *b;
    
    b = dynamic_cast<B*>(&a);
    if ( b != nullptr )
        b->fkt2();
    


  • Skym0sh0 schrieb:

    du brauchst einen upcast...

    ist kein schönes design sondern eher dreckig und langsam:

    A<Klasse> a;
    B<Klasse> *b;
    
    b = dynamic_cast<B*>(&a);
    if ( b != nullptr )
        b->fkt2();
    

    Das ist doch blödsinn. b wird immer == nullptr sein, weil wie der TE schon richtig erkannt hat, a kein B ist.
    Ich vermute mal, dass Vererbung hier einfach nicht das richtige Mittel ist! Versuch es doch mal mit Komposition

    class B
    {
      void f1() { a.f1(); }
      A a;
    };
    

    oder Aggregation

    class B
    {
      void f1() { a->f1(); }
      A* a;
    };
    

    Oder am besten erklärst du uns mal das Problem genauer.



  • hm ... ok .. danke ich muss da wohl nochmal brühten ^^ ...

    naja der knackpunkt ist das A ein signal darstellt mit dem zwischen anderen klassen komuniziert wird. Dieses Signal will ich abfangen und dann mittels B an die GUI senden.

    ich werd nochmal ne genauere beschreibung verfassen ... aber ich fahr gleich zug ... ^^ ... da hab ich dann nochmal zeit drüber nachzudenken ... mal sehen ...


Anmelden zum Antworten