5

Ich verwende Visual Studio 2005 Professional Edition.C++ Typid-Operator

Im folgenden Beispiel ist SomeClass eine Klasse, die in der DLL-Datei von Drittanbietern definiert ist, die ich verwende. SomeClass verfügt über virtuelle Methoden. Ich habe festgestellt, dass die Operator-Typ-ID unterschiedliche Ergebnisse liefert, wenn sie auf den Typ selbst angewendet wird und auf ein Objekt dieses Typs angewendet wird. Ist das normales Verhalten und wenn nicht, was könnte der Grund für ein solches Verhalten sein?

typeid(SomeClass).raw_name() // the value of this is "[email protected]@" 
typeid(SomeClass).name()   /// "class SomeClass" 

SomeClass obj; 
typeid(obj).raw_name(); // "[email protected]@" 
typeid(obj).name();  // "class TLomeClass" 
+2

0% Seitenverhältnis. Ich werde das nicht beantworten. Besonders nachdem ich herausgefunden habe, dass ich bereits eine Ihrer Fragen gestellt habe. :-) –

+0

welche Frage :) – user152508

+0

Die Fragen, die ich untersucht habe, wurden gelöst - um die hilfreichste Antwort auf Ihre Fragen zu akzeptieren, verwenden Sie das Häkchen. –

Antwort

2

Ist der Code in Ihrer Frage der Code, mit dem Sie Probleme haben, gleich oder ähnlich?

typeid Operator, wenn es um die polymorphen Typen angewandt wird, kehrt das type_info Objekt, das den dynamischen Typen des polymorphen Objekts identifiziert. So zum Beispiel, wenn Sie gelten typeid auf eine Referenz vom Typ Base & (wobei Base polymorph ist), die tatsächlich auf ein Objekt vom Typ gebunden ist Derived (wobei Derived von Base abgeleitet ist), das type_info Objekt zurückgegeben durch typeid wird entsprechen die Derived Klasse, nicht zu Base Klasse. Könnte es sein, dass so etwas in deinem Code passiert?

Auch in einigen Compilern (wie MS Visual Studio), um voll funktionsfähige typeid zu verwenden, wie oben beschrieben, müssen Sie Ihren Code mit Run-Time Typ Information (RTTI) aktiviert kompilieren. Vielleicht hat das Fehlen von RTTI zu den seltsamen Effekten geführt, die Sie beobachtet haben.

P.S. Im Gegensatz zu dem, was in der derzeit akzeptierten Antwort angegeben ist, ist typeid vollständig und perfekt Standard-C++ - Funktion. Es ist keine Compiler-Erweiterung.

+0

Ja, Sie haben Recht. In meinem Beispiel hatte ich eine Bibliotheksfunktion, die den Basiszeiger zurückgibt, der auf das abgeleitete Klassenobjekt zeigt. Die Signatur der Funktion war jedoch Base * function(), und in der Bibliotheksdokumentation wurde Base Class als Leaf-Klasse aufgerufen, d. H. Es wurden keine Klassen angegeben, die von ihr erben sollten. Aber ich nehme an, dass die Funktion tatsächlich einen Zeiger zurückgegeben hat, der auf eine abgeleitete Klasse zeigt, die in der Bibliotheksdokumentation nicht erwähnt wird. Wenn ich das sage: Base baseObj; Base * basePtr = Funktion(); dann ist die folgende Aussage wahr typeof (baseObj)! = Typeof (* basePtr) – user152508

1

Der Grund für dieses Verhalten ist irgendwo dokumentiert on MSDN. Das spezifische Verhalten, das Sie in diesem speziellen Fall sehen, ist wahrscheinlich auf die Verwendung von Vererbung oder einer Compiler-Erweiterung zurückzuführen, die nicht vom Anbieter des .DLL dokumentiert ist.

Das Verhalten des Operators ist nicht durch den C++ - Standard definiert und daher eine Compiler-Erweiterung. Sie können sich nicht auf sein Verhalten verlassen, noch können Sie vernünftige Erwartungen haben, herauszufinden, warum es das tut, was es tut, es sei denn, es ist explizit vom Hersteller dokumentiert. Ihr Verhalten hat sich möglicherweise in VS2008 geändert und unterscheidet sich wahrscheinlich von VS2003. (Es unterscheidet sich sicherlich von GCC, ICC und verschiedenen anderen Compilern.)

+0

Vielen Dank für Ihre Antwort.Dies hilft mir sehr. Nach einigen Untersuchungen kam ich zu dem Schluss, dass der Verkäufer einige undokumentierte Zukünfte der jeweiligen Klasse hat. – user152508

+0

Es tut mir leid: was? !!! Der Operator 'typeid' ist eindeutig und explizit durch den C++ - Standard definiert. Es ist keine Compiler-Erweiterung. – AnT

+0

Ja, typeid ist im Standard 8defined *, aber sein * Verhalten * ist nicht. Die einzige explizite Anforderung lautet: 'typename A a1, a2; assert (typeof (a1) == typeof (a2)); "Alles, was darüber hinausgeht, ist bei meiner Lektüre eine Erweiterung. – greyfade