使用动态强制转换进行类型转换引用的最佳做法

Best practices on typecasting references using dynamic cast

提问人:RedRidingHood 提问时间:5/8/2023 最后编辑:RedRidingHood 更新时间:5/8/2023 访问量:77

问:

我需要实现一个继承自纯虚拟父级的类,我需要编写代码的成员之一是 。但我实际上需要这个运算符的 2 个不同版本 - 一个接受虚拟父类作为其右侧参数,另一个接受具体的子类(参见下面的代码)。首选哪种方式对引用进行类型转换,以及为什么 - 获取指针、转换指针、检查并取消引用(这有点尴尬)或转换引用并处理可能发生的异常?我已经研究了 stackoverflow 上的一些 Q/A,有人建议在成功类型转换相当必要的情况下处理异常更可取(这不是我的情况)。但是,由于与旧的异常处理机制相比,现代异常是轻量级和快速的,也许异常是要走的路?如果除了我建议的两个选项之外,还有其他选项,我想知道它们。 谢谢。operator+=dynamic_castNULL

class IRow
{
    ...
public:
    virtual IRow& operator+=(const IRow& rhs) = 0;
    ...
}

class StlBasedRow : public IRow
{
    ...
public:
    ...
    StlBasedRow& operator+=(const StlBasedRow& rhs)
    {
        /*
         * Operator is applied to arguments of the same type
         * which allows faster operation due to knowledge about
         * how elements are stored internally in this particular
         * implementation of the base class IRow
         */
    }

    StlBasedRow& operator+=(const IRow& rhs)
    {
        /*
         *  This one?
         */
        try
        {
            StlBasedRow& rhs_concrete = dynamic_cast<StlBasedRow&>(rhs);
            *this += rhs_concrete;
        }
        catch(std::bad_cast e)
        {
            // operator applied to a base class (IRow)
        }

        /*
         *  Or this one?
         */
        StlBasedRow* rhs_concrete = dynamic_cast<StlBasedRow*>(&rhs);
        if(rhs_concrete != NULL)
        {
            *this += *rhs_concrete;
        }
        else
        {
            // operator applied to a base class (IRow)
        }
    }
    ...
}
C++ 继承 强制转换 运算符重载

评论

1赞 Marek R 5/8/2023
你的代码设计很糟糕 如果你必须在运算符重载中进行动态转换。无论如何,如果你在动态转换中使用指针,则不会抛出异常,所以你可以这样做:StlBasedRow* rhs_concrete = dynamic_cast<StlBasedRow*>(&rhs);
0赞 user17732522 5/8/2023
"但是,由于与旧的异常处理机制相比,现代异常是轻量级和快速的,也许异常是要走的路?“:在特殊情况下,它们的成本非常高。我不认为这有什么真正改变。但无论如何,本身也是相当昂贵的。dynamic_cast
0赞 RedRidingHood 5/8/2023
@MarekR但是为什么它很糟糕,这种情况的解决方法是什么?
1赞 Marek R 5/8/2023
阅读有关双重调度和访客模式的信息。
0赞 RedRidingHood 5/8/2023
@user17732522您是如何衡量绩效的?它们是否有已知的“基准”,或者您只是根据自己的经验讲述?dynamic_cast

答: 暂无答案