2010-11-17 16 views
9

que espera que este código para imprimir 'mismos 1' y 'Same2', pero sólo se imprime 'Same1':typeid de tipos polimórficos

#include <iostream> 
#include <typeinfo> 
using namespace std; 

struct C{virtual ~C(){}}; 
struct D : C{}; 
int main(){ 
    D d; 
    C c, &cr1 = d; 
    if(typeid(cr1) == typeid(D)) cout << "Same1"; 
    if(typeid(&cr1) == typeid(D*)) cout << "Same2"; 
} 

Tanto § 5.2.8/2 y § 5.3. 1/3 parece sugerirme que se debe imprimir 'Same2'.

¿Qué y dónde está la captura?

+0

Quizás quiso decir 'C c, * cr1 = & d'? –

+0

@dark_charlie: Eso es básicamente mover el operador de la dirección de dos líneas hacia arriba. Obtendrá el mismo resultado, incluso si escribió 'typeid ((C *) & d)'. – MSalters

+0

@MSalters: Ah, nvm mí, simplemente no puedo leer. –

Respuesta

17

Los apuntadores no son tipos polimórficos. No tienen miembros virtuales. De hecho, no tienen miembros en absoluto. Tampoco pueden derivar de otros tipos ni usarse como clases base. Por lo tanto, el tipo estático y dinámico de T* es siempre T*.

En su línea "Same2", está comparando el tipo de letra de un puntero, no el objeto apuntado. Por lo tanto, el compilador solo mira los tipos estáticos C* y D*. Obviamente no son lo mismo, y deben tener distintos objetos type_info.

Cuestiones relacionadas