通过引用派生类对象从Base类对象进行向下转换时抛出的bad_cast异常

时间:2017-04-09 09:44:09

标签: c++ dynamic-cast downcast

我仍然想知道为什么以下内容会导致std::bad_cast异常

#include <typeinfo>
class A {virtual void fun() {}};
class B : public A {};
int main() {
    try { 
       A a; 
       B b = dynamic_cast<B&>(a);
    } catch (std::bad_cast& e) {
       std::cerr << e.what() << '\n';
    }
}

class A是一个多态类 课程B公开来自A 通过引用正确地从基类A对象执行向下转换,dynamic_cast确实接受引用参数 但仍然为什么这个例外?

2 个答案:

答案 0 :(得分:4)

这是dynamic_cast应该做的事情。 a实际上是A的对象,将其转换为派生类B会失败。另一方面,如果您将具有引用类型或指针的东西转换为基类,但实际上引用了B的对象,那么它将正常工作。 e.g。

B b1;
A& ra = b1;
B b2 = dynamic_cast<B&>(ra);

答案 1 :(得分:2)

你基本上说的是“我有动物,但它是狮子吗?”

语言需要能够说“是狮子”或“不是狮子”。

当你转换为指针类型时,如果“是”

,它可以通过向你返回nullptr或者指向狮子的实际指针来说“no”

然而,没有空引用这样的东西。因此,当你施放到参考时,它需要一种不同的机制来通知你,你的动物不是狮子。在这种情况下,它会抛出一个糟糕的强制转换异常。