typeid funktioniert nicht wie erwartet



  • Hallo, wenn ich die typeid richtig Verstanden habe, dann müsste im Folgenden Code "Hat geklappt" ausgegeben werden, das tut es aber nicht...typeid ermittelt doch den tatsächlichen Typen der Klasse, auch wenn der Zeiger eine Basisklasse ist, oder?

    #include <iostream>
    #include <typeinfo>
    using namespace std;
    
    class Form {};
    class Rechteck : public Form {};
    
    int main() {
    	Form *pnt;
    	Rechteck r;
    	pnt = &r;
    	if(typeid(*pnt) == typeid(Rechteck))
    		cout << "Hat geklappt: " << typeid(*pnt).name() << endl;	
    	else
    		cout << "Hat nicht geklappt: " << typeid(*pnt).name() << endl;
    }
    


  • Jessy12 schrieb:

    ...typeid ermittelt doch den tatsächlichen Typen der Klasse, auch wenn der Zeiger eine Basisklasse ist, oder?

    Nur wenn noch mindestens eine virtuelle Funktion im Spiel ist.



  • Nur, wenn die Basisklasse eine virtuelle Funktionstabelle hat. So müsste es gehen:

    class Form {
    public:
      virtual ~Form() { }
    };
    

    Rest wie gehabt.

    Ich fühle mich an dieser Stelle allerdings verpflichtet, darauf hinzuweisen, dass dein Vorhaben in nahezu allen Fällen eine ausgesprochen schlechte Idee ist. Objektorientiert sauber ist es, Form eine ausreichend umfangreiche Schnittstelle zur Verfügung stellen zu lassen und diese in allen Kindklassen auszufüllen - wenn Client-Code etwas vom Typ Form& bekommt, sollte er sich nicht darum scheren müssen, welcher konkreten Klasse das Objekt, das sich dahinter verbirgt, nun genau ist. Das ist ja der Sinn von Vererbung.



  • hmpf schrieb:

    Nur wenn noch mindestens eine virtuelle Funktion im Spiel ist.

    Passenderweise nennt man solche Typen dann auch "polymorphe Typen". Die braucht man dann auch für einen dynamic_cast.



  • Mir geht es noch eher um's Verständnis und vielen Dank 🙂

    Wenn eine basisklasse polymorph ist, d.h. mindestens eine virtual funktion hat, so sind auch alle von ihr abgeleiteten Funktionen polymorph, oder?

    gruß Jessy



  • Jessy12 schrieb:

    Wenn eine basisklasse polymorph ist, d.h. mindestens eine virtual funktion hat, so sind auch alle von ihr abgeleiteten Funktionen polymorph, oder?

    Ja.


Anmelden zum Antworten