2016-05-11 2 views
2

Я хотел знать, можно ли получить исходный тип объекта, если он удерживается указателем на базовый класс.Проверка исходного типа преобразованного объекта

Например:

class Base { 
    virtual void f() = 0 
}; 
class Derived: public Base {}; 

Base * ptr=new Derived; 
//if I use 
cout << typeid(ptr).name(); //prints Base* 

Я хочу, чтобы напечатать тип оригинала "Производная". Есть ли способ сделать это?

+1

Вы не * конвертировали * 'Derived' в' Base'. – CinCout

ответ

5

Да, статический и динамический тип ptr оба являются Base *. Однако, для *ptr, ситуация другая. Статический тип - Base &, но динамический тип - Derived &. Так что это то, что вы хотите проверить:

cout << typeid(*ptr).name(); 
+0

Работал. Спасибо! – mrpink121

0

Вы можете попробовать с dynamic_cast

if(Derived* d = dynamic_cast<Derived*>(b1)) 
{ 
    std::cout << "downcast from b1 to d successful\n"; 
    d->name(); // safe to call 
} 

Будьте осторожны, так как это часто рассматривается как плохая практика, и вы не должны действительно сделать это. Вы не делаете need класс производного типа, старайтесь думать в терминах интерфейсов.

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