2016-05-11 58 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派生類型的類,嘗試根據接口來思考。