我想知道通过指向基类的指针是否可以获取对象的原始类型。
例如:
class Base {
virtual void f() = 0
};
class Derived: public Base {};
Base * ptr=new Derived;
//if I use
cout << typeid(ptr).name(); //prints Base*
我希望它打印原始类型“Derived”。有办法吗?
答案 0 :(得分:5)
是的,ptr
的静态和动态类型都是Base *
。但是,对于*ptr
,情况有所不同。静态类型为Base &
,但动态类型为Derived &
。这就是你要测试的内容:
cout << typeid(*ptr).name();
答案 1 :(得分: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
派生类型类,试着用接口来思考。