polymorphie problem



  • hi ihrs,

    da ich früher in java gearbeitet habe, hab ich nun ein kleines polymorphie problem. es geht um folgendes:
    - es existiert objekt A als virtuelles objekt mit funktion set(i)
    - es existieren abgleitete objekte von A mit den Namen B,C,D,.... welche die funktion set(i) überladen

    nun möchte ich ein allgemeines suchbaum objekt bauen, welches allgemein auf jeden objekt vom typ A oder einer seiner unterobjekte funktioniert. in jedem knoten des suchbaums wird die set funktion aufgerufen, und es soll logischerweise immer die funktion des tiefsten typen aufgerufen werden, also wenn ich den suchbaum für ein objekt vom typ C benutze, dann soll set(i) von C aufgerufen werden.
    zusätzlich dazu muß das objekt kopiert werden, bevor ich den suchbaum rekursiv aufrufen kann.

    mir ist bisher nur eingefallen im suchbaum objekt mit einem zeiger auf objekttyp A zu arbeiten und für jeden rekursiven aufruf das objekt zu dereferenzieren, kopieren und einen neuen zeiger drauf zu setzen.

    hat jemand ne tolle idee, oder kann mir ein paar zeilen pseudo-code schreiben...
    Vielen Dank!
    Sebastian



  • Mach die Funktion set virtuell, dann hast du das Problem schon gelöst.

    Zu letzterem um eine Kopie von einem abgeleiteten Typ zu Erstellen spendierst du der Hierarchie am einfachsten eine clone()-Methode welche eine Kopie zum richtigen Typ erstellt. So kannst du die Kopie erstellen ohne den Typ kennen zu müssen.

    class A
    {
    public:
      virtual void set( int i ) = 0; //pure virtual ->muss überschrieben werden
      virtual A& clone() = 0; //dito
    
      virtual ~A(); //nicht vergessen den Destruktor virtuell zu machen!
    };
    
    class B : public A
    {
    public:
      virtual void set( int i ){}
      virtual B& clone()
      {
         return *( new B() );
      }
    }; 
    
    //Anwendung
    B b;
    A& a = b;
    
    B& copyOfB = a.clone(); //erzeugt ein B da a auf ein B verweist
    A* pointerToCopy = &copyOfB;
    
    pointerToCopy->set( 0 );
    


  • sebastian_v_b schrieb:

    da ich früher in java gearbeitet habe, hab ich nun ein kleines polymorphie problem.

    Wie hättest du's denn in Java gemacht? Ich seh da nämlich keinen allzu großen Unterschied...

    lolz' Idee ist schon ganz gut, auch wenn seine Implementierung noch nicht ganz hinhaut.

    class A
    {
    public:
      virtual A* clone() const = 0;
      // oder ggf.
      virtual A* clone() const { return new A(*this); }
    };
    
    class B
    {
    public:
      virtual B* clone() const { return new B(*this); }
    };
    

    Das set(i) hab ich mal ausgelassen, jetzt hast du das Keyword virtual ja mittlerweile gesehen.

    Ach ja, dieser Suchbaum - ist das eine Übung oder so? Ansonsten bringt dich std::set evtl. auch weiter.


Anmelden zum Antworten