2010-11-17 4 views
9

Я ожидал, что этот код, чтобы напечатать '1' Same и 'Same2', но печатает только 'Same1':TypeId для полиморфных типов

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

Оба § 5.2.8/2 и § 5,3. 1/3, кажется, подсказывают мне, что «Same2» должен быть напечатан.

Что и где поймать?

+0

Вы имели в виду 'C c, * cr1 = & d'? –

+0

@dark_charlie: Это в основном просто перемещает адрес оператора двумя строками вверх. Вы получите тот же результат, даже если бы вы написали 'typeid ((C *) & d)'. – MSalters

+0

@MSalters: Ах, nvm меня, я просто не могу читать. –

ответ

17

Указатели не являются полиморфными типами. У них нет виртуальных участников. Фактически, у них нет членов. Они также не могут быть получены из других типов и не могут использоваться в качестве базовых классов. Следовательно, статический и динамический тип T* всегда T*.

В строке «Same2» вы сравниваете typeid указателя, а не объекта, на который указывает объект. Поэтому компилятор рассматривает только статические типы C* и D*. Они, очевидно, не то же самое и должны иметь различные объекты type_info.

Смежные вопросы