dynamic_cast抛出bad_cast
异常,如果你转换了引用,但我知道标准指针被认为是引用,即指针是引用的类型。
那么在投射指针时我应该得到bad_cast吗?
这个问题来自this page的try-catch块。这个try-catch块不合适吗?
答案 0 :(得分:5)
如果出现错误演员,则会发出指针,dynamic_cast
将返回null
此外,dynamic_cast仅适用于多态类,因此,如果您正在讨论内置数据类型(来自问题中的链接),那么您应该使用static_cast
。
顺便说一句,参考文献是 NOT 指针。
答案 1 :(得分:1)
关于原始问题“在投射指针时我应该得到bad_cast吗?”,No。
这就是为什么你可以看到像
这样的结构if( T* pT = dynamic_cast<T*>( p ) ) ... // use pT in if body
关于新问题“这个try-catch块是否不合适?”,不,它是一个try
- catch
块来捕获分配错误;它与dynamic_cast
无关。
干杯&amp;第h。,
答案 2 :(得分:0)
由于dynamic_cast<T*>
不会抛出异常,因此完全不需要其中一个try-catch块。
但是,您可以轻松定义自己的强制转换函数,它确实会为指针抛出异常。这就是我在自己的代码中所做的事情(简化代码,并且请注意,我使用垃圾收集,因此我可以抛出指针而不会产生任何后果):
template <class Class, class Object>
inline Class* cast (Object* obj)
{
Class* result = dynamic_cast<Class*>(obj);
if( obj != null and result == null ){
throw new ClassCastException(); // unusual, throw bad_cast if you prefer
}
return result;
}
template <class Class, class Object>
inline const Class* cast (const Object* obj)
{
const Class* result = dynamic_cast<const Class*>(obj);
if( obj != null and result == null ){
throw new ClassCastException(); // unusual, throw bad_cast if you prefer
}
return result;
}
另外,我还将它用作static_cast的语法糖,但这只是可能的,因为我没有将它用于dynamic_cast引用和const引用:
template <class Class, class Object>
inline Class cast (const Object& obj)
{
return static_cast<Class>(obj);
}
我会说你最好实现自己的强制转换函数,它在异常处理方面是连贯的,并且正是你想要和期望的。我做了,从不回头。