C++ 通过引用派生类对象从基类对象向下转换时引发错误的\u转换异常

C++ 通过引用派生类对象从基类对象向下转换时引发错误的\u转换异常,c++,dynamic-cast,downcast,C++,Dynamic Cast,Downcast,我仍然想知道为什么下面给出了std::bad\u 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 &

我仍然想知道为什么下面给出了
std::bad\u 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';
    }
}
#包括
类{virtualvoid fun(){};
B类:公共A{};
int main(){
试试{
A A;
B=动态施法(a);
}捕获物(标准::坏的铸件和e){
std::cerr这就是应该做的。
a
实际上是
a
的一个对象,将其转换为派生类
B
将失败。另一方面,如果您转换具有引用类型或指向基类的指针的对象,但实际上引用了
B
的对象,那么它将正常工作

B b1;
A& ra = b1;
B b2 = dynamic_cast<B&>(ra);
b1;
A&ra=b1;
B b2=动态铸型(ra);

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

语言需要能够说“是的,它是一头狮子”或“不,它不是一头狮子”

当您强制转换到指针类型时,它可以通过向您返回null ptr来表示“否”,如果“是”,则返回指向lion的实际指针


但是,没有空引用。因此,当您对引用进行强制转换时,它需要一种不同的机制来通知您您的动物不是狮子。在这种情况下,它会引发错误的强制转换异常。

您是否希望强制转换操作符返回对有效B对象的引用?它在哪里可以找到一个呢?
a
是不是a
B
,因此转换失败是正确的行为。如果不希望出现异常,请将其转换为指针而不是引用,然后根据nullptr检查返回值以查看转换是否成功。