Abgeleitete Funktion überladen und aus der Basisklasse aufrufen



  • mich würde interessieren ob es möglich ist eine rein virtuelle methode in der unterklasse zu definieren und dann so zu überladen, dass sie auch aus oberklasse pointern aufgerufen wird?

    konkreter fall:
    ich habe in meinem spiel ausrüstungsgegenstände die vom interface "IEquippable" abgeleitet werden und "recieveEvent(IEvent const& e)" definieren müssen. z.b. um eingehenden schaden zu verwalten. jetzt wäre es natürlich praktisch, wenn man diese methode nur überläd und die entsprechenden events automatisch in der richtigen methode landen. also:

    class Jacket : public IEquippable
    {
    [...]
    bool recieveEvent(DamageEvent const& e){LOG("damage");}
    bool recieveEvent(IEvent const& e){LOG("standart);}
    [...]
    };
    

    sende ich jetzt an ein Jacket objekt im Jacket pointer ein event sende bekomme ich "damage" geloggt (wer hätts gedacht) im IEquippable pointer bekomme ich "standart". da ich aber ausrüstung immer nur mit IEquippable behandle...



  • Kann es sein, dass du nach double dispatching suchst?



  • ja korrekt, danke 🙂
    das stichwort hat mir geholfen

    PS: klasse signatur 😃

    EDIT:
    ich habs jetzt implementiert, aber es läuft immer noch nicht so wie ich will.
    nur damit ich das richtig verstanden habe:

    meine code änderungen:

    struct eqDamageEvent : public IEvent
    {
    	void fireEqEvent(IEquippable& eq)
    	{
    		eq.recieveEvent(*this);
    	}
    };
    
    IEquippable* jacket = new TestJacket();
    IEquippable::eqDamageEvent e;
    e.fireEqEvent(*jacket);
    

    ich rufe vom event die methode fireEqEvent(...) auf. weil eq innerhalb der methode eine referenz ist wird recieveEvent im vtable nachgeschaut was dazu führt, dass die methode recieveEvent(DamageEvent &const) aus der unterklasse TestJacket gefunden wird. is aber leider nicht so, ich bekomme immernoch die ausgabe "standart". was habe ich also misverstanden?


Anmelden zum Antworten