Я использую Выпуск Proffesional Visual Studio 2005 года.
В следующем примере SomeClass является классом, который определяется в третьем лице dll библиотека, которой я пользуюсь. SomeClass имеет виртуальные методы. Я заметил, что идентификатор типа оператора дает различные результаты при применении к самому типу, и при применении к объекту типа. Это нормальное поведение, и если не, какова могла бы быть причина такого поведения?
typeid(SomeClass).raw_name() // the value of this is ".?AVSomeClass@@"
typeid(SomeClass).name() /// "class SomeClass"
SomeClass obj;
typeid(obj).raw_name(); // ".?AVTLomeClass@@"
typeid(obj).name(); // "class TLomeClass"
Код в вашем вопросе тот же или похож на код, с которым у вас возникли проблемы?
Оператор typeid
, когда он применяется к полиморфным типам, возвращает объект type_info
, который идентифицирует динамический тип полиморфного объекта. Так, например, если применить typeid
к ссылке типа Base &
(где Base
является полиморфным), которая на самом деле привязана к объекту типа Derived
(где Derived
является производной от Base
), объект type_info
, возвращаемый типом typeid
, будет соответствовать классу Derived
, а не классу Base
. Может быть, в вашем коде происходит нечто подобное?
Также, в некоторых компиляторах (например, MS Visual Studio) для того, чтобы использовать полнофункциональный тип typeid
, как описано выше, необходимо скомпилировать ваш код с включенной RTTI (Run-Time Type Information). Возможно, отсутствие RTTI привело к странным эффектам, которые вы заметили.
P.S. В отличие от того, что указано в принятом в настоящее время ответе, typeid
является полностью и совершенно стандартной функцией C++. Это не расширение компилятора.
Причина такого поведения документально зафиксирована где-то на MSDN. Специфическое поведение, которое Вы видите в данном конкретном случае, вероятно, связано с использованием не документированного производителем .DLL расширения компилятора или наследства.
Поведение оператора не определено стандартом языка Си++, и как таковое является расширением компилятора. Нельзя полагаться на его поведение и не иметь разумных ожиданий узнать, почему он делает то же, что и он, если только он явно не документирован поставщиком. Его поведение, возможно, изменилось в VS2008 и, скорее всего, отличается от VS2003. (Оно, конечно же, отличается от GCC, ICC и различных других компиляторов.)
.