C++ c++;动态强制转换错误处理

C++ c++;动态强制转换错误处理,c++,dynamic-cast,C++,Dynamic Cast,是否有与动态\u cast错误处理相关的良好实践(除非在不需要时不使用)?我想知道我该如何处理它可能抛出的空值和坏值。 我要检查两个吗?如果我捕捉到坏的\u cast或检测到NULL,我可能无论如何都无法恢复。。。 现在,我使用assert检查dynamic_cast是否返回非NULL值。您会在代码审查时接受此解决方案吗?这取决于…;-) 如果我真的希望dynamic_cast能给我一些可用的东西,例如,如果我和其他人都没有向指向基类的指针容器添加多态类型,那么我会使用引用cast,让std::

是否有与动态\u cast错误处理相关的良好实践(除非在不需要时不使用)?我想知道我该如何处理它可能抛出的空值和坏值。 我要检查两个吗?如果我捕捉到坏的\u cast或检测到NULL,我可能无论如何都无法恢复。。。 现在,我使用assert检查dynamic_cast是否返回非NULL值。您会在代码审查时接受此解决方案吗?

这取决于…;-)

如果我真的希望
dynamic_cast
能给我一些可用的东西,例如,如果我和其他人都没有向指向基类的指针容器添加多态类型,那么我会使用引用cast,让
std::bad_cast
杀死我的应用程序,真的没有什么其他事情可做


然而,如果我正在查询一个多态类型,查找它不一定要实现的接口公开的某些功能,那么我会使用指针转换,然后NULL不会是一个错误(当然,除非我期望该功能真的在那里,但是我一开始就使用了引用转换…)

如果
动态\u-cast
成功,那么最好使用
boost::polymorphic\u-downcast
来代替,这有点像这样:

assert(dynamic_cast<T*>(o) == static_cast<T*>(o));
return static_cast<T*>(o);
if (T* t = dynamic_cast<T*>(o)) {
    t->func(); //< Use t here, it is valid
}
// consider having an else-clause
仅当0指针在上下文中有意义时,才对指针类型使用
dynamic\u cast
。如果如下所示,您可能希望在
中使用它:

assert(dynamic_cast<T*>(o) == static_cast<T*>(o));
return static_cast<T*>(o);
if (T* t = dynamic_cast<T*>(o)) {
    t->func(); //< Use t here, it is valid
}
// consider having an else-clause
if(T*T=dynamic_cast(o)){
t->func();//<在这里使用t,它是有效的
}
/考虑另一个子句
使用最后一个选项,您需要确保执行路径在
dynamic\u cast
返回0时有意义


要直接回答您的问题:我更喜欢我给出的前两个备选方案中的一个,而不是在代码中使用显式的
断言:)

只有在转换引用时才会抛出bad\u cast

dynamic_cast< Derived & >(baseclass)
dynamic\u cast(基类)
强制转换指针时返回NULL

dynamic_cast< Derived * >(&baseclass)
dynamic_cast(&baseclass)
所以永远不需要同时检查这两个


断言是可以接受的,但这在很大程度上取决于上下文,然后,对于几乎所有的断言都是如此……

我同意“它取决于”的答案,并添加了“优雅的降级”:仅仅因为某个cast在某个地方失败并不足以让应用程序失败(以及用户失去工作等)。我建议将断言和防御性编程相结合:

ptr = dynamic_cast<MyClass>(obj);
ASSERT(ptr);
if(ptr)
{
   // do stuff
}
ptr=dynamic_cast(obj);
断言(ptr);
如果(ptr)
{
//做事
}
是和否

boost::polymorphic_downcast
无疑是在调试阶段处理
动态_cast
错误的一个很好的选择。但是值得一提的是,只有当可以预测编译时传递的多态类型时,才应该使用
polymorphic\u downcast
,否则应该使用
dynamic\u cast
来代替它

然而,一系列:

if (T1* t1 = dynamic_cast<T1*>(o)) 
{ }
if (T2* t2 = dynamic_cast<T2*>(o)) 
{ }
if (T3* t3 = dynamic_cast<T3*>(o)) 
{ }
if(T1*T1=dynamic_cast(o))
{ }
if(T2*T2=动态_-cast(o))
{ }
如果(T3*T3=动态_-cast(o))
{ }
表示一个非常糟糕的设计,应该通过多态性虚拟函数来解决