оператор ввода с ++ - PullRequest
       18

оператор ввода с ++

5 голосов
/ 23 декабря 2009

Я использую Visual Studio 2005 Proffesional Edition.

В следующем примере SomeClass - это класс, определенный в сторонней библиотеке dll, которую я использую. SomeClass имеет виртуальные методы. Я заметил, что оператор typeid дает разные результаты при применении к самому типу и применительно к объекту типа. Это нормальное поведение, и если нет, то что может быть причиной такого поведения?

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"

Ответы [ 2 ]

2 голосов
/ 26 декабря 2009

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

Оператор typeid, когда он применяется к полиморфным типам, возвращает объект type_info, который идентифицирует тип динамический полиморфного объекта. Так, например, если вы примените typeid к ссылке типа Base & (где Base является полиморфной), которая фактически связана с объектом типа Derived (где Derived является производным от Base), объект type_info, возвращаемый typeid, будет соответствовать классу Derived, а не Base. Может быть, что-то подобное происходит в вашем коде?

Кроме того, в некоторых компиляторах (например, MS Visual Studio) для использования полнофункционального typeid, как описано выше, вам необходимо скомпилировать код с включенной информацией о типах времени выполнения (RTTI). Возможно, отсутствие RTTI привело к странным эффектам, которые вы наблюдали.

P.S. Вопреки тому, что указано в принятом в настоящее время ответе, typeid является полностью и совершенно стандартной функцией C ++. Это не расширение компилятора.

1 голос
/ 24 декабря 2009

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

Поведение оператора не определяется стандартом C ++ и, как таковое, является расширением компилятора. Вы не можете полагаться на его поведение и не иметь разумных ожиданий выяснить, почему он делает то, что он делает, как он делает, если только это явно не задокументировано продавцом. Его поведение могло измениться в VS2008 и, вероятно, отличается от VS2003. (Это, безусловно, отличается от GCC, ICC и различных других компиляторов.)

...