我在使用dynamic_cast
的异常处理时遇到了一些问题。它始终没有返回bad_cast
。
下面的声明是没有丢我bad_cast ,虽然返回d1
nullptr
并且编译器向我显示警告
derived *d1 = dynamic_cast <derived *> (&base);
但如果我尝试使用以下声明:
derived d1 = dynamic_cast <derived &> (base);
然后它会抛出std :: bad_cast
我错过了逻辑中的一些东西吗?类是多态的。
答案 0 :(得分:3)
这是这样定义的。
如果要转换的新类型是指针,则错误时结果为nullptr。 如果它是引用,则抛出异常。
请参阅http://en.cppreference.com/w/cpp/language/dynamic_cast
如果强制转换成功,dynamic_cast将返回new_type类型的值。如果强制转换失败并且new_type是指针类型,则返回该类型的空指针。如果转换失败并且new_type是引用类型,则抛出与std :: bad_cast类型的处理程序匹配的异常。
答案 1 :(得分:2)
正如已经回答的那样,这是已定义的行为。
这背后的逻辑是,当开发人员要求程序将指针转换为另一个类型指针时,您可以返回null作为有效的失败结果。
但你不能用引用来做。没有&#34; null reference&#34;你也不能构建&#34;默认参考&#34;并通过引用传递给dynamic_cast
(作为&#34; out&#34;参数)。基本上,如果你不能将引用转换为另一种类型的引用,那么除了抛出异常之外别无其他。任何其他&#34;失败技术&#34; (例如返回bool
,错误代码,空指针等)无法使用引用。
作为旁注,我自己在我的作品中使用dynamic_cast
,但我根本不为它感到骄傲。对我来说,使用dynamic_cast
是某种防御性编程。通常,如果你持有指针或对基类的引用,使用虚函数来处理派生类行为更有意义,然后明确地经历手动套管的痛苦。
答案 2 :(得分:1)
这是dynamic_cast的预期行为。
如果转换失败并且new_type是指针类型,则返回该类型的空指针。如果转换失败并且new_type是引用类型,则抛出与类型std::bad_cast的处理程序匹配的异常。