我想知道是否有可能通過指向基類的指針獲取對象的原始類型。檢查轉換對象的原始類型
例如:
class Base {
virtual void f() = 0
};
class Derived: public Base {};
Base * ptr=new Derived;
//if I use
cout << typeid(ptr).name(); //prints Base*
我希望它打印原稿類型 「派生」。有沒有辦法做到這一點?
我想知道是否有可能通過指向基類的指針獲取對象的原始類型。檢查轉換對象的原始類型
例如:
class Base {
virtual void f() = 0
};
class Derived: public Base {};
Base * ptr=new Derived;
//if I use
cout << typeid(ptr).name(); //prints Base*
我希望它打印原稿類型 「派生」。有沒有辦法做到這一點?
是的,ptr
的靜態和動態類型都是Base *
。但是,對於*ptr
,情況有所不同。靜態類型爲Base &
,但動態類型爲Derived &
。所以這是你要考什麼:
cout << typeid(*ptr).name();
工作。謝謝! – mrpink121
您可以dynamic_cast
if(Derived* d = dynamic_cast<Derived*>(b1))
{
std::cout << "downcast from b1 to d successful\n";
d->name(); // safe to call
}
儘量小心,這往往被視爲一種不好的做法,你真的不應該這樣做。您不要need
派生類型的類,嘗試根據接口來思考。
您沒有*轉換*'派生'爲'基地'。 – CinCout