c++ dynamic_cast 错误处理

标签 c++ dynamic-cast

是否有任何与 dynamic_cast 错误处理相关的良好做法(除非在不必要时不使用它)?我想知道我应该如何处理它可以抛出的 NULL 和 bad_cast 。 我应该检查两者吗?如果我捕捉到 bad_cast 或检测到 NULL,我可能无论如何都无法恢复...... 现在,我使用 assert 来检查 dynamic_cast 是否返回非 NULL 值。你会在代码审查时接受这个解决方案吗?

最佳答案

如果 dynamic_cast 应该 成功,最好使用 boost::polymorphic_downcast 代替,这有点像这样:

assert(dynamic_cast<T*>(o) == static_cast<T*>(o));
return static_cast<T*>(o);

这样,您将在调试构建中检测错误,同时避免发布构建中的运行时开销。

如果您怀疑转换可能失败并且您想检测它,请使用 dynamic_cast 并转换为引用类型。如果出现错误,此转换将抛出 bad_cast,并将取消您的程序。 (如果正如你所说,你无论如何都不会恢复,这很好)

T& t = dynamic_cast<T&>(o);
t.func(); //< Use t here, no extra check required

仅当 0 指针在上下文中有意义时,才将 dynamic_cast 用于指针类型。您可能希望像这样在 if 中使用它:

if (T* t = dynamic_cast<T*>(o)) {
    t->func(); //< Use t here, it is valid
}
// consider having an else-clause

使用最后一个选项,如果 dynamic_cast 返回 0,您需要确保执行路径有意义。

直接回答您的问题:我更喜欢我给出的两个第一个替代方案之一,而不是在代码中明确 assert :)

关于c++ dynamic_cast 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/246293/

相关文章:

c++ char * 在构造函数中初始化

c++ - 如何为 dynamic_cast 指定 “all parameterized types” 或 “all argument lists”?

c++ - 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成空指针?

c++ - dynamic_cast "this"到派生类型 : when is it legal?

c++ - 如何通过交叉广播恢复接口(interface)

c++ - 为什么在 C++ 中将 "using namespace"包含到头文件中是个坏主意?

为 map 对象执行但不更改值的 C++ 函数

c++ - 如何通过代理服务器环境获取非标准服务?

c++检查基引用的大多数派生类是否具有另一个基

c++ - 如何安装 boost::contract?