说我有两个班级
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);
为什么使用指针进行强制转换而不使用引用?
答案 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 reference
。 dynamic_cast
无法返回nullptr以指示此对象的动态类型与目标类型不兼容,因此它会引发std :: bad_cast。