2010-11-17 4 views
9

ce code Je prévu d'imprimer SAME 1 'et 'SAME2', mais il imprime seulement 'Same1':typeid pour les types polymorphes

#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"; 
} 

deux § 5.2.8/2 et § 5.3. 1/3 semblent me suggérer que 'Same2' devrait être imprimé.

Quoi et où est la prise?

+0

Voulez-vous dire 'c c, * cr1 = & d'? –

+0

@dark_charlie: C'est simplement en déplaçant simplement l'adresse-de l'opérateur de deux lignes vers le haut. Vous obtiendrez le même résultat, même si vous avez écrit 'typeid ((C *) & d)'. – MSalters

+0

@MSalters: Ah, nvm moi, je ne peux pas lire. –

Répondre

17

Les pointeurs ne sont pas des types polymorphes. Ils n'ont pas de membres virtuels. En fait, ils n'ont aucun membre. Ils ne peuvent pas non plus dériver d'autres types, ni être utilisés comme classes de base. Par conséquent, le type statique et dynamique d'un T* est toujours T*.

Dans votre ligne "Same2", vous comparez le type d'un pointeur, pas l'objet pointé. Le compilateur ne regarde donc que les types statiques C* et D*. Ils ne sont évidemment pas identiques et doivent avoir des objets distincts.

Questions connexes