始终不会从dynamic_cast抛出bad_cast

时间:2016-08-29 09:34:26

标签: c++ casting

我在使用dynamic_cast的异常处理时遇到了一些问题。它始终没有返回bad_cast

下面的声明是没有丢我bad_cast ,虽然返回d1 nullptr并且编译器向我显示警告

derived *d1 = dynamic_cast <derived *> (&base);

但如果我尝试使用以下声明:

derived d1 = dynamic_cast <derived &> (base);

然后它会抛出std :: bad_cast

我错过了逻辑中的一些东西吗?类是多态的。

3 个答案:

答案 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的处理程序匹配的异常。