5

Sto usando Visual Studio 2005 Proffesional Edition.C++ operatore di typeid

Nell'esempio seguente SomeClass è una classe definita nella libreria di DLL di terze parti che sto utilizzando. SomeClass ha metodi virtuali. Ho notato che l'operatore typeid dà risultati diversi se applicato al tipo stesso e quando viene applicato all'oggetto del tipo. Questo comportamento normale è, e se no, quale potrebbe essere la ragione di tale comportamento?

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% aspect rate. Non ho intenzione di rispondere a questo. Soprattutto dopo che ho scoperto che ho già preso di mira una delle tue domande. :-) –

+0

quale domanda :) – user152508

+0

Le domande che ho esaminato sono state risolte - per accettare la risposta più utile alle tue domande usa il segno di spunta. –

risposta

2

Il codice nella tua domanda è uguale o simile al codice con cui stai riscontrando problemi?

Operator typeid, quando è applicata ai tipi polimorfi, restituisce l'oggetto type_info che identifica la dinamica tipo dell'oggetto polimorfo . Così, per esempio, se si applica typeid ad un riferimento di tipo Base & (dove Base è polimorfica), che in realtà è associata a un oggetto di tipo Derived (dove Derived è derivato da Base), l'oggetto type_info restituito da typeid sarà conforme a la classe Derived, non alla classe Base. Potrebbe essere che qualcosa del genere stia accadendo nel tuo codice?

Inoltre, in alcuni compilatori (come MS Visual Studio) per utilizzare lo typeid completamente funzionale, come descritto sopra, è necessario compilare il codice con RTTI (Run-Time Type Information) abilitato. Forse l'assenza di RTTI ha portato agli strani effetti che hai osservato.

P.S. Contrariamente a quanto indicato nella risposta attualmente accettata, typeid è una funzionalità C++ completa e perfettamente standard. Non è un'estensione del compilatore.

+0

Sì, hai ragione. Nel mio esempio stavo avendo una funzione di libreria che restituisce il puntatore di base che punta all'oggetto di classe derivata. Tuttavia, la firma della funzione era Base * function(), e nella documentazione della libreria Base class apperead come classe foglia, non è stata specificata alcuna classe da ereditare da essa. Ma suppongo di sì, che la funzione stia effettivamente restituendo un puntatore che punta a più classi derivate che non sono state dette nella documentazione della liberia. Io se dico questo: Base baseObj; Base * basePtr = fucntion(); la seguente affermazione è vera typeof (baseObj)! = Typeof (* basePtr) – user152508

1

Il motivo di questo comportamento è documentato da qualche parte on MSDN. Il comportamento specifico che si sta verificando in questo caso particolare è probabilmente dovuto a un uso dell'ereditarietà o a un'estensione del compilatore, non documentata dal fornitore della DLL.

Il comportamento dell'operatore non è definito dallo standard C++ e in quanto tale è un'estensione del compilatore. Non puoi fare affidamento sul suo comportamento, né puoi avere una ragionevole aspettativa di scoprire perché fa quello che fa nel modo in cui lo fa, a meno che non sia esplicitamente documentato dal venditore. Il suo comportamento potrebbe essere cambiato in VS2008 e probabilmente differisce da VS2003. (Sicuramente differisce da GCC, ICC e vari altri compilatori.)

+0

Grazie per la risposta. Questo mi aiuta molto. In realtà, dopo alcune indagini, sono giunto alla conclusione che il venditore ha qualche futuro non documentato della particolare classe. – user152508

+0

Mi dispiace: cosa? !!! L'operatore 'typeid' è definito in modo chiaro ed esplicito dallo standard C++. Non è un'estensione del compilatore. – AnT

+0

Sì, typeid è 8definito * nello standard, ma il suo * comportamento * non lo è. L'unico requisito esplicito è che: 'typename A a1, a2; asserire (typeof (a1) == typeof (a2)); "Qualsiasi cosa oltre a ciò, tramite la mia lettura, è un'estensione. – greyfade