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

use*_*398 4 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;
    }
}  
Run Code Online (Sandbox Code Playgroud)

此代码打印出"无价值".

son*_*yao 16

因为a实际上指的A不是a B,那么dynamic_cast就会失败.

是否有可能使用dynamic_cast

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

A* a = new B;
B* b = dynamic_cast<B*>(a);
Run Code Online (Sandbox Code Playgroud)

请参见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.


Ser*_*sta 8

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

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