"instanceof" in C++



  • Hallo!

    Ich habe eine Klasse und mehrere weitere davon abgeleitete Klassen. Wenn ich jetzt ein Objekt einer Sub-Klasse habe, dieses aber in einem Pointer vom Typ der Superklasse speichere, gibt es dann eine Möglichkeit festzustellen, um welchen Typ es sich dabei wirklich handelt?

    Im Prinzip suche ich sowas wie den instanceof-Operator in Java. Oder muss ich mir sowas über eine Art virtuelle getType()-Methode selber schreiben?

    Danke!

    mfg



  • Hallo

    es gibt in C++ die Schlüsselworte typeid und dynamic_cast, die sowas können.
    Allerdings sind solche Typüberprüfungen oft ein falsches Konzept.
    Denn es ist ja grade bei polymorphen Klassenhierarchien der Witz, das nach dem Erstellen einer höheren Instanz die Schnittstellen der Basisklasse ausreichen.

    bis bald
    akari



  • Danke! In meinem Fall ist es glaube ich gerechtfertigt diese Schlüsselworte zu verwenden, wobei eine genaue Beschreibung des konkreten Problems jetzt zu lang würde und vermutlich ohnehin niemanden interessiert 🙂



  • ChrisR schrieb:

    ...eine genaue Beschreibung des konkreten Problems jetzt zu lang würde und vermutlich ohnehin niemanden interessiert 🙂

    Mich schon 😉

    Liegt aber daran, dass ich eigentlich überzeugt bin, dass IMMER ein Designfehler vorliegt, wenn man sowas "braucht". Deswegen wäre ich schon daran interessiert, weil es meine Grundthese entweder be- oder widerlegen könnte... 😉

    Aber wenn Dir das zu aufwändig ist, kann ich das auch verstehen.

    Gruß,

    Simon2.



  • virtual BasePtr* Base::getDerivedAPtr(){return 0;}
    DerivedAPtr* DerivedA::getDerivedAPtr(){return this;}
    

    riecht schneller.

    hab sowas sogar mal gebraucht (bzw rtti, mit dem das auch gegangen haben tun würde). details tun nix zur sache, im prinzip aber müßte folgendes einen guten geschmack davon geben.

    //speicherlöcher mal in kauf genommen zwecks fokusierung 
    //auf den kern des problems. außerdem machts auch mal spass, 
    //sowas zu haben.
    struct Summe
    {
      Ausdruck* a;
      Ausdruck* b;
      Ausdruck* optimize(){
         a=a->optimize();
         b=b->optimize();
         if(Kostante* ka=a->getKonstantePtr())
            if(Konstante* kb=b->getKonstantePtr())
               return new Konstante(a->value+b->value);
         if(Konstante* ka=a->getKonstantePtr())
            if(ka->value==0)
               return b;
         if(Konstante* kb=b->getKonstantePtr())
            if(kb->value==0)
               return a;
      }
    };
    

    wenn ich mir recht überlege, würde es auch mit dem double-dispatching-code von "mehr effektiv c++ programmieren" gehen. nur scheint mir das mit dem getTypePtr recht harmonisch reinzupassen und hier mal zu gewinnen.


Log in to reply