检查已转换对象的原始类型

时间:2016-05-11 06:06:47

标签: c++ c++11

我想知道通过指向基类的指针是否可以获取对象的原始类型。

例如:

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

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

我希望它打印原始类型“Derived”。有办法吗?

2 个答案:

答案 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派生类型类,试着用接口来思考。