提问人:RedRidingHood 提问时间:5/8/2023 最后编辑:RedRidingHood 更新时间:5/8/2023 访问量:77
使用动态强制转换进行类型转换引用的最佳做法
Best practices on typecasting references using dynamic cast
问:
我需要实现一个继承自纯虚拟父级的类,我需要编写代码的成员之一是 。但我实际上需要这个运算符的 2 个不同版本 - 一个接受虚拟父类作为其右侧参数,另一个接受具体的子类(参见下面的代码)。首选哪种方式对引用进行类型转换,以及为什么 - 获取指针、转换指针、检查并取消引用(这有点尴尬)或转换引用并处理可能发生的异常?我已经研究了 stackoverflow 上的一些 Q/A,有人建议在成功类型转换相当必要的情况下处理异常更可取(这不是我的情况)。但是,由于与旧的异常处理机制相比,现代异常是轻量级和快速的,也许异常是要走的路?如果除了我建议的两个选项之外,还有其他选项,我想知道它们。
谢谢。operator+=
dynamic_cast
NULL
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)
}
}
...
}
答: 暂无答案
评论
StlBasedRow* rhs_concrete = dynamic_cast<StlBasedRow*>(&rhs);
dynamic_cast
dynamic_cast