RTTI vermeiden



  • Hallo,

    ich habe eine virtuelle Basisklasse B und zwei davon abgeleitete D1 und D2. Jetzt will ich entscheiden, ob ein Objekt B ein D1 oder ein D2 ist. Das ginge natürlich mit typeid (RTTI), aber die soll man ja vermeiden.

    Wie löse ich das am besten? Eine virtual = 0-Funktion in B einbauen und sie in D1 und D2 verschieden überladen?



  • Du musst das nicht entscheiden, sondern einfach machen lassen. Der Weg dazu sind virtuelle Funktionen, ja.



  • Aber nicht auf die Idee kommen, RTTI mit virtual nachzubauen.

    virtual bool BinIchKlasseD1() const; // Nein!
    

    Lieber gleich die benötigte Funktionalität polymorph implementieren, sodass auf User-Seite gar nie eine Fallunterscheidung auftritt.



  • Desweiteren muss die Methode von B nicht unbedingt pure virtual ( = 0 ) sein.
    solange die Methode virtuell ist, wird automatisch bei einem B* der auf ein D1 oder D2 zeigt die jeweilige Methode von D1 oder D2 aufgerufen



  • Nexus schrieb:

    Aber nicht auf die Idee kommen, RTTI mit virtual nachzubauen.

    virtual bool BinIchKlasseD1() const; // Nein!
    

    Lieber gleich die benötigte Funktionalität polymorph implementieren, sodass auf User-Seite gar nie eine Fallunterscheidung auftritt.

    Oh, OK. Danke für die Warnung.-



  • DrakoXP schrieb:

    Desweiteren muss die Methode von B nicht unbedingt pure virtual ( = 0 ) sein.

    Wenn in B jedoch keine sinnvolle Implementierung möglich ist, schon.



  • hmmmmmmmmmm schrieb:

    Hallo,

    ich habe eine virtuelle Basisklasse B und zwei davon abgeleitete D1 und D2. Jetzt will ich entscheiden, ob ein Objekt B ein D1 oder ein D2 ist. Das ginge natürlich mit typeid (RTTI), aber die soll man ja vermeiden.

    Wie löse ich das am besten? Eine virtual = 0-Funktion in B einbauen und sie in D1 und D2 verschieden überladen?

    Überschreiben, nicht überladen.
    Überladen würde in dem Fall gar nix bringen.


Log in to reply