【问题标题】:Throw bad_cast when converting pointers with dynamic_cast?用dynamic_cast转换指针时抛出bad_cast?
【发布时间】:2011-08-14 07:16:59
【问题描述】:

如果您强制转换引用,dynamic_cast 会抛出 bad_cast 异常,但正如我所知,在标准指针中被视为引用,即指针是引用的一种类型。
那么在转换指针时我应该得到 bad_cast 吗?

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

【问题讨论】:

  • 您在哪里发现“指针是引用的一种类型。”?

标签: c++ pointers casting reference


【解决方案1】:

没有指针,如果演员阵容不好,dynamic_cast 将返回null
此外,dynamic_cast 仅适用于多态类,因此,如果您正在谈论内置数据类型(来自问题中的链接),那么您应该使用 static_cast

顺便说一句,引用是不是指针。

【讨论】:

  • 我不是说引用是指针,我说指针是引用的一种。那是真正不同的事情!
  • 没有指针是不是的一种引用,它们都是不同的事物
  • @Narek:在 C++ 术语中,“引用”用于引用。我同意这是一个非常尴尬的术语。但是为了避免误解,我们需要非常小心地保持舌头直(或任何英语的惯用表达!)。 :-)
  • 如果它在指针转换过程中没有抛出,那么为什么链接中有一个 try-cats 块?不合适吗?
  • @Narek:如果您注意到,链接中的代码会在每个 dynamic_cast 之后检查 null。那里的try-catch 会捕获new 抛出的bad_alloc 异常,但try-catch 甚至不能这样做。所以是的,这是一个不好的例子。
【解决方案2】:

关于原始问题“那么我应该在转换指针时得到 bad_cast 吗?”,不。

这就是为什么你可以看到类似的结构

if( T* pT = dynamic_cast<T*>( p ) ) ...  // use pT in if body

关于新问题“这个try-catch块不合适吗?”,不,它是一个try-catch块来捕获分配错误;它与dynamic_cast 本身无关。

干杯,

【讨论】:

    【解决方案3】:

    由于dynamic_cast&lt;T*&gt; 不会引发异常,因此完全不需要其中一个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);
    }
    

    我想说您最好实现自己的转换函数,该函数在异常处理方面是连贯的,并且准确地执行您想要和期望的事情。我做到了,而且从未回头。

    【讨论】:

    • 很好,但我必须说完全断章取义。问题在于 OP 对 dynamic_cast 是否抛出异常的理解,S/He 引用了一个特定的例子来阐明这种理解,OP 不希望这种行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多