诺基亚是否误用了static_cast?

sno*_*kin 6 c++ qt pointers casting

我刚刚看到这个例子:

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

QWidget *pw = static_cast<QWidget *>(parent);
Run Code Online (Sandbox Code Playgroud)

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

如:

QWidget *pw = dynamic_cast<QWidget*>(parent)
Run Code Online (Sandbox Code Playgroud)

谢谢,

Jol*_*hic 8

如果你知道你正在从一个基础类下行到一个后代类(也就是说,你知道该对象实际上是一个后代类的实例),那么static_cast是完全合法的(并且性能更高).

  • 我认为性能报价是一个红色的听觉.有一个成本,但在那个距离它是非常小的.除非这是一个非常紧密的循环,否则你可能会看到没有区别.因此,通过使用dynamic_cast <>,您将在代码中添加安全性(假设他们检查了NULL指针).如果您知道该对象属于所需类型,那么您就会遇到设计问题. (2认同)

Ale*_* C. 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
}
Run Code Online (Sandbox Code Playgroud)

像这样使用:

QWidget* w = down_cast<QWidget*>(parent);
Run Code Online (Sandbox Code Playgroud)