使用dynamic_cast进行向下转换返回null

时间:2016-05-12 12:46:56

标签: c++ dynamic-cast downcast

我尝试使用dynamic_cast将基类对象强制转换为派生类对象,但dynamic_cast返回null。是否可以使用dynamic_cast进行向下转换?

struct A {
  virtual ~A() {}
};

struct B : A {};


int main()
{
    A* a = new A();

    B* b = dynamic_cast<B*>(a);
    if(b){
      std::cout << "b has value" << std::endl;
    }else{
      std::cout << "no value" << std::endl;
    }
}  

此代码打印出&#34;没有值&#34;。

2 个答案:

答案 0 :(得分:16)

由于a实际上指的是A,而不是B,因此dynamic_cast会失败。

  

是否可以使用dynamic_cast投降?

是的,你可以,例如如果a完全指向B

A* a = new B;
B* b = dynamic_cast<B*>(a);

请参阅http://en.cppreference.com/w/cpp/language/dynamic_cast

  

5)如果expression是多态类型Base的指针或引用,new_type是Derived类型的指针或引用,则执行运行时检查:

     

a)检查由表达式指向/识别的最派生对象。如果在该对象中,表达式指向/指向Derived的公共基础,并且如果只有一个派生类型的子对象是从由表达式指向/标识的子对象派生的,则转换结果/指向该派生子对象。 (这被称为“垂头丧气”。)

     

...

     

c)否则,运行时检查失败。如果在指针上使用dynamic_cast,则返回new_type类型的空指针值。如果它在引用中使用,则抛出异常std::bad_cast

答案 1 :(得分:4)

那是每个设计。当您想要测试指向基类对象的指针是否实际指向子类时,使用dynamic_cast。如果它是一个子类对象,dynamic_cast将为您提供一个有效的指针,如果不是,则只需一个nullptr

当你创建一个A类对象,并且A不是B的子类时,dynamic_cast通常会返回一个空指针。