动态演员 - 两者之间的差异

时间:2014-05-05 06:28:17

标签: c++ dynamic-cast

说我有两个班级

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);

为什么使用指针进行强制转换而不使用引用?

3 个答案:

答案 0 :(得分:1)

正如预期的那样,演员阵容在两​​种情况下均失败。

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

答案 1 :(得分:1)

当指针/引用实际指向某个类别的对象时,可以使用dynamic_cast。但在您的情况下,对象实际上是类foo,而不是foobar。因此,第一个将提供nullptr,第二个将提出异常。

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

类似供参考。

答案 2 :(得分:0)

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