Virtuelle clone-Methode



  • Hallo,
    ich habe eine Methode clone(), die einen Pointer auf eine Kopie des aktuellen Objekts zurückgeben soll. Dies soll mit Polymorphie funktionieren.

    Eltern-Klasse:

    virtual Query_Base* clone() 
    {return 0;}
    

    Vererbte Klasse:

    WordQuery* WordQuery::clone() const
    {
    	WordQuery* i = new WordQuery;
    	i->query_text = query_text;
    	return i;
    }
    

    Rufe ich also clone() auf, durch einen Query_Base-Pointer, der auf ein WordQuery-Objekt zeigt, so wird die Query_Base-Version der Methode ausgeführt, die immer 0 zurückgibt.
    Da die Methode ja virtual ist, hätte ich erwartet, dass die in der vererbten Klasse veränderte Version genutzt wird, was aber nicht der Fall ist.

    Ist das ein Verständnisfehler von mir oder ein Code-Fehler?



  • clone() const ist etwas anderes als clone() ohne const .
    Außerdem ist der Rückgabetyp falsch und die Methode sollte abstrakt sein.
    Die Implementation der Methode ist nicht korrekt, weil im Fall einer Ausnahme bei der Zuweisung des Elementes das geklonte Objekt verlorengeht. Du solltest einen Kopierkonstruktor verwenden.



  • clone() const ist etwas anderes als clone() ohne const.

    Oh Mann...
    Danke.

    Außerdem ist der Rückgabetyp falsch und die Methode sollte abstrakt sein.

    Das hatte ich geändert, da ich vorher einen Compiler-Fehler gemeldet bekam.

    Die Implementation der Methode ist nicht korrekt, weil im Fall einer Ausnahme bei der Zuweisung des Elementes das geklonte Objekt verlorengeht. Du solltest einen Kopierkonstruktor verwenden.

    Hm... macht Sinn 🙂



  • Außerdem ist der Rückgabetyp falsch und die Methode sollte abstrakt sein.

    Das mit dem Rückgabetypen geht in Ordnung. Nennt sich Kovarianz.


Anmelden zum Antworten