Map und Polymorphie? Unvereinbar?



  • Hallo!

    Ich habe folgendes Problem.

    Ich habe eine Klasse

    class Operator
    {
    ......
    public:
    virtual void exucute();
    .......
    }

    und eine Klasse

    class Operator_Plus: public Operator
    {
    ......
    public:
    virtual void exucute();
    .......
    }

    wie man sieht sind die beiden voneinander abgeleitet und das funktioniert auch wunderbar....

    jetzt habe ich folgendes Problem...

    Ich erstelle folgende map:

    map<char,Operator> my_map

    my_map.insert(pair<char,Operator> ('+',op);

    wobei op com typ "const Operator_Plus&" ist

    und füge dann einen Operator_Plus in die Map ein.
    Das Funktioniert wunderbar und ist deswegen nötig weil wie Operator_Plus noch viele Andere Operator_XXX Klassen von Operator abgeleitet werden sollen und in dieser Map gespeichert werden sollen...

    wenn ich jetzt den Operator_Plus den ich vorher in die Map reingegeben habe wieder raushole und die Methode execute Aufrufe, dann wird sie von der Elternklasse aufgerufen.

    Operator x=my_map['+'];
    x.execute();

    Wie kann ich es schaffen dass die Methode von Operator_Plus afgerufen wird?

    Vielen Dank im Vorhinein!

    LG

    René



  • Hallo,
    ziemlich genau das gleiche Problem gab es letztens hier:
    http://www.fun-soft.de/showtopic.php?threadid=14900

    MfG Spacelord



  • Das Problem das du hast nennt man "Slicing". Um es zu vermeiden musst du in
    deine map Basisklassen-Pointer stecken.
    Im Moment wird beim Einfügen eines Operator_plus-Objekt ein Operator-Objekt,
    als Kopie, erstellt das dann in der map steckt. Die Operator_Plus-Funktion
    geht definitiv verloren. Durch die Verwendung von Basisklassen-Pointer
    vermeidest du genau diesen Effekt.



  • CrazyHorse schrieb:

    Durch die Verwendung von Basisklassen-Pointer
    vermeidest du genau diesen Effekt.

    Nur zur Unterstützung: Genau dafür ist das Schlüsselwort virtual ja afaik auch da. Damit die korrekten Methoden des eigentlichen Objektes aufgerufen werden und nicht die einer Basisklasse, wenn Du nur einen Zeiger vom Typen Basisklasse auf das Objekt besitzt.



  • Ah... danke.

    Ich hatte es eh schon mit map<char,Operator*> versucht aber in meiner Müdigkeit hatte ich geschrieben map<char,*Operator>... *lol*

    jetzt gehts

    danke


Anmelden zum Antworten