使用dynamic_cast转换指针时抛出bad_cast?

时间:2011-08-14 07:17:00

标签: c++ pointers casting reference

dynamic_cast抛出bad_cast异常,如果你转换了引用,但我知道标准指针被认为是引用,即指针是引用的类型。
那么在投射指针时我应该得到bad_cast吗?

这个问题来自this page的try-catch块。这个try-catch块不合适吗?

3 个答案:

答案 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);
}

我会说你最好实现自己的强制转换函数,它在异常处理方面是连贯的,并且正是你想要和期望的。我做了,从不回头。