我刚遇到this example:
向下滚动到页面底部,您将找到
QWidget *pw = static_cast<QWidget *>(parent);
Parent类型为:QObject,它是QWidget的Base类,所以在这种情况下,isnt: 应该使用dynamic_cast吗?
如:
QWidget *pw = dynamic_cast<QWidget*>(parent)
谢谢,
答案 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
。请谨慎使用。