诺基亚是否误用了static_cast?

时间:2011-03-28 14:48:19

标签: c++ qt pointers casting

我刚遇到this example

向下滚动到页面底部,您将找到

QWidget *pw = static_cast<QWidget *>(parent);

Parent类型为:QObject,它是QWidget的Base类,所以在这种情况下,isnt: 应该使用dynamic_cast吗?

如:

QWidget *pw = dynamic_cast<QWidget*>(parent)

谢谢,

6 个答案:

答案 0 :(得分:8)

如果你知道你正在从一个基础类转向一个后代类(即,你知道该对象实际上是一个子类的实例),那么static_cast是完全合法的(并且性能更高)。

答案 1 :(得分:8)

不,如果parent的运行时类型为QWidget*,那么static_cast<QWidget*>(parent)已明确定义,并按预期执行。如果没有,则行为未定义。

dynamic_cast对比,template <typename T, typename U> T* down_cast(U* x) { #ifdef NDEBUG return static_cast<T*>(x); #else return &dynamic_cast<T&>(*x); // Thanks @Martin #endif } 始终定义行为但效率较低,因为它必须使用运行时类型信息。

在调试模式下安全地向下转发并在发布模式下快速转发的好方法是:

QWidget* w = down_cast<QWidget*>(parent);

像这样使用:

{{1}}

答案 2 :(得分:2)

由于你明确要求误用:反之亦然,在这里使用dynamic_cast是错误的。

虽然两者都是合法的,但dynamic_cast表示您(程序员)不确定演员表是否会成功,并且您应该检查演员表的结果以测试成功。如果你确定演员阵容会成功,那么这是极具误导性的。因此,请改用static_cast。这表明类型总是众所周知的,并且演员的结果肯定会成功。

答案 3 :(得分:0)

只要您可以确定父实际上必须是QWidget或QWidget的派生类型,static_cast就完全没问题了,并为您提供了使用dynamic_cast会丢失的其他信息。

所以你可以把它看作是额外的文档 - 显然只是假设编写代码的人知道他们正在做什么(我们会给他们带来怀疑的好处;)

答案 4 :(得分:0)

这里没有“应该”。两者都将完美无缺。在这里使用dynamic_cast的原因是,如果您想要执行转换有效性的运行时检查。但是代码的作者并不觉得他们需要运行时检查,因此不需要dynamic_cast

事实上,很少需要dynamic_cast,因为在大多数情况下static_cast会完成这项工作。正如完整性检查可能会在其中添加一个dynamic_cast的断言,但不是主要的强制转换方法。

答案 5 :(得分:0)

通常情况下,如果您的代码可以知道原始对象是QWidget(可能是通过其他标志),那么您可以节省时间并改为static_cast。请谨慎使用。