Casten und Attribute nicht "verlieren"



  • Hallo,
    ich wollte mich mal nach Lösungsmöglichkeiten für folgendes Problem erkundigen, vermutlich haben viele von euch schon mal ein derartiges Problem gehabt:

    Ich habe zwei Klassen, sagen wir Obst und Apfel. Apfel erbt von Obst.

    Nun habe ich eine Methode, die ein Obst als Parameter erwartet. Hier übergebe ich nun einen Apfel, den ich vorher in ein Obst caste.
    Nun habe ich natürlich dass Problem, dass ich nicht mehr auf die Apfel-Eigenschaften zugreifen kann, was ich aber möchte 🙂

    gibts da ne lösung für? vorschläge? eventuell ein pattern oder dergleichen?



  • visitor patter, double dispatching oder ganz brutal schauen ob dynamic_cast geht.



  • geilo genau das richtige danke 😃



  • Wenn du das Obst per Kopie übergibst ( void func(Obst param); ), sind die Apfel-Eigenschaften unwiderbringlich verloren. Deshalb übergibt man polymorphe Objekte üblicherweise per Referenz/Zeiger - und dann deutet es normalerweise auf schlechtes Design, wenn du direkt auf Eigenschaften einer spezifischen Klasse zugreifen MUSST (wenn die Funktion davon ausgeht, einen Apfel zu bekommen, solltest du das auch in der Parameterliste klarstellen, wenn sie ein Obst erwartet, sollte sie sich nur auf dessen Interface beschränken (wobei die Klasse 'Apfel' natürlich berechtigt ist, die virtuellen Methoden zu überschreiben)).



  • gaylord schrieb:

    ...
    gibts da ne lösung für? vorschläge? eventuell ein pattern oder dergleichen?

    Naja, eigentlich ist das das ganz normale Polymorphie ... die man in C++ üblicherweise über Zeiger/Referenzen löst:

    struct Obst {
        int obstAttr;
        virtual int& attr() { return obstAttr; }
    };
    
    struct Apfel : Obst {
        int apfelAttr;
        virtual int& attr() { return apfelAttr; }
    };
    
    void f(Obst& o) {
        ++o.attr();
    }
    
    int main(void) {
        Apfel a;
        a.apfelAttr = 1;
        f(a);
        return 0;
    }
    

    Das bedeutet natürlich, dass die Obst-Schnittstelle das entsprechend bedienen muß... (andernfalls: s. CStoll).

    Gruß,

    Simon2.


Anmelden zum Antworten