使用dynamic_cast的向下广播返回null

Downcasting using dynamic_cast returns null

本文关键字:广播 返回 null dynamic cast 使用      更新时间:2023-10-16

我试图用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;
    }
}  

此代码打印出"无值"。

因为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) 如果表达式是多态类型Base的指针或引用,而new_type是派生类型的指针或参考,则执行运行时检查:

a) 检查表达式指向/标识的派生对象最多的对象。如果在该对象中,表达式指向/引用Derived的公共基,并且只有一个Derived类型的子对象是从表达式指向/标识的子对象派生的,则强制转换的结果指向/引用该Derived子对象。(这被称为"下行"。)

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

这是每个设计的。dynamic_cast用于测试基类对象的指针是否实际指向子类。如果它是子类对象,dynamic_cast会给你一个有效的指针,如果不是,你只会得到一个nullptr

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