我仍然想知道为什么以下内容会导致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
确实接受引用参数
但仍然为什么这个例外?
答案 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”然而,没有空引用这样的东西。因此,当你施放到参考时,它需要一种不同的机制来通知你,你的动物不是狮子。在这种情况下,它会抛出一个糟糕的强制转换异常。