2016-05-11 35 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

您没有*转换*'派生'为'基地'。 – 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派生类型的类,尝试根据接口来思考。