оператор идентификатора типа C++

Я использую Выпуск 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"
5
задан user152508 23 December 2009 в 20:14
поделиться

2 ответа

Код в вашем вопросе тот же или похож на код, с которым у вас возникли проблемы?

Оператор 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++. Это не расширение компилятора.

.
2
ответ дан 15 December 2019 в 06:27
поделиться

Причина такого поведения документально зафиксирована где-то на MSDN. Специфическое поведение, которое Вы видите в данном конкретном случае, вероятно, связано с использованием не документированного производителем .DLL расширения компилятора или наследства.

Поведение оператора не определено стандартом языка Си++, и как таковое является расширением компилятора. Нельзя полагаться на его поведение и не иметь разумных ожиданий узнать, почему он делает то же, что и он, если только он явно не документирован поставщиком. Его поведение, возможно, изменилось в VS2008 и, скорее всего, отличается от VS2003. (Оно, конечно же, отличается от GCC, ICC и различных других компиляторов.)

.
1
ответ дан 15 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: