5

Estoy usando Visual Studio 2005 Proffesional Edition.C++ typeid operator

En el siguiente ejemplo, SomeClass es una clase definida en la biblioteca dll de terceros que estoy usando. SomeClass tiene métodos virtuales. Observé que el operador typeid arroja resultados diferentes cuando se aplica al tipo en sí y cuando se aplica al objeto del tipo. ¿Es este comportamiento normal, y si no, cuál podría ser el motivo de tal comportamiento?

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% tasa de aspecto. No voy a responder esto. Especialmente después de descubrir que ya respondí una de sus preguntas. :-) –

+0

what question :) – user152508

+0

Las preguntas que investigué se resolvieron: para aceptar la respuesta más útil a sus preguntas, use la marca de verificación. –

Respuesta

2

¿El código de su pregunta es el mismo o similar al código con el que está teniendo problemas?

operador typeid, cuando se aplica a tipos polimórficos, devuelve el objeto type_info que identifica el dinámico tipo del objeto polimórfico. Así, por ejemplo, si se aplica typeid a una referencia de tipo Base & (donde Base es polimórfico), que en realidad está enlazado a un objeto de tipo Derived (donde Derived se deriva de Base), el objeto type_info devuelto por typeid corresponderá a la clase Derived, no a la clase Base. ¿Podría ser que algo así está sucediendo en tu código?

Además, en algunos compiladores (como MS Visual Studio) para utilizar totalmente funcional typeid, como se describió anteriormente, necesita compilar su código con información de tipo de tiempo de ejecución (RTTI) habilitada. Tal vez la ausencia de RTTI condujo a los efectos extraños que observaste.

P.S. Contrariamente a lo que se afirma en la respuesta aceptada actualmente, typeid es la característica de C++ completamente y perfectamente estándar. No es una extensión de compilación.

+0

Sí, tienes razón. En mi ejemplo, estaba teniendo una función de biblioteca que devuelve un puntero base que apunta al objeto de clase derivado. Sin embargo, la firma de la función era Base * function(), y en la documentación de la biblioteca, la clase Base se leyó como clase hoja, es decir, no se especificaron clases para heredar de ella. Pero supongo que sí, que la función en realidad estaba devolviendo un puntero que apunta a una clase más derivada que no se dice en la documentación de la biblioteca. Es decir, si digo esto: Base baseObj; Base * basePtr = fucntion(); entonces la siguiente declaración es verdadera typeof (baseObj)! = Typeof (* basePtr) – user152508

1

El motivo de este comportamiento está documentado en algún lugar on MSDN. El comportamiento específico que está viendo en este caso particular probablemente se deba a algún uso de herencia, o alguna extensión de compilación, no documentada por el proveedor de .DLL.

El comportamiento del operador no está definido por el estándar C++, y como tal es una extensión del compilador. No puede confiar en su comportamiento, ni puede tener ninguna expectativa razonable de descubrir por qué hace lo que hace de la forma en que lo hace, a menos que esté explícitamente documentado por el proveedor. Su comportamiento puede haber cambiado en VS2008, y probablemente difiera de VS2003. (Ciertamente difiere de GCC, ICC y varios otros compiladores).

+0

Gracias por su respuesta. Esto me ayuda mucho. En realidad, después de algunas investigaciones, llegué a la conclusión de que el vendedor tiene algunos futuros no documentados de la clase en particular. – user152508

+0

Lo siento: ¿qué ?! El operador 'typeid' se define clara y explícitamente mediante el estándar C++. No es una extensión de compilación. – AnT

+0

Sí, typeid está 8 definido * en el estándar, pero su * comportamiento * no lo es. El único requisito explícito es que: 'typename A a1, a2; assert (typeof (a1) == typeof (a2)); 'Cualquier cosa más allá de eso, por mi lectura, es una extensión. – greyfade