动态铸造-两者之间的区别

Dynamic cast - Difference between the two

本文关键字:区别 两者之间 动态      更新时间:2023-10-16

假设我有两个类

class foo
{
   .......
   virtual ~foo() {..}
};
class foobar : public foo
{
};

以下不会导致错误:

foo* c = new foo();
foobar* j = dynamic_cast<foobar*>(c);

但是,以下强制转换在运行时会导致错误:

foo c;
foo &d = c;
foobar& j = dynamic_cast<foobar&>(d);

为什么强制类型转换适用于指针而不适用于引用?

正如预期的那样,在这两种情况下强制转换都会失败。

在第一种情况下,它返回一个nullptr,您应该在取消引用指针之前对其进行测试。在第二种情况下,不存在任何可以返回的内容,并且强制转换引发了std::bad_cast异常。这就是dynamic_cast的设计目的。

当指针/引用实际指向派生类的对象时,可以使用dynamic_cast。但在您的情况下,对象实际上属于foo类,而不是foobar类。所以第一个将给出nullptr,第二个将引发异常。

 foo* ob = new foobar();
 foobar* f_ob = dynamic_cast<foobar*>(ob);

类似以供参考。

没有null referencedynamic_cast无法返回nullptr来指示此对象的动态类型与目标类型不兼容,因此它引发std::bad_cast。