是否始终允许从Base*
转换为Derived*
?是否始终允许从const Base*
转换为const Derived*
?
我正在使用Qt QSharedPointers。我有一个QSharedPointer到Base
对象,我想将QSharedPointer转换为Derived
对象。我事先检查了指针的类型为Derived
。
是否有可能100%成功
static_cast<QSP<Derived>>
dynamic_cast<QSP<Derived>>
QSP<Derived>(my_base_pointer)
例如,对于直接转换:
QSP<Derived> inpf = QSP<Derived>(my_base_pointer) ;
我有错误
Error 1 error C2440: 'initializing' : cannot convert from 'Base *' to 'Derived *'
my_base_pointer
类型const QSP<Base>
。
是因为常数吗?我应该const_cast吗?我想constness不是根本原因,因为如果我
const QSP<Derived> inpf = static_cast<const QSP<Derived>>(my_base_pointer);
发生同样的错误。
答案 0 :(得分:6)
您正在为QSP<Derived>
构造函数提供一个Base*
指针,这将无效。只要您确定指针确实是Derived*
,您就应该能够静态地播放它:
QSP<Derived> inpf = QSP<Derived>(static_cast<Derived*>(my_base_pointer)) ;
如果基类至少有一个虚函数,那么在这种情况下使用dynamic_cast
会更安全,因为它是为它创建的。如果指针实际上不是指向派生类的指针,那么你将获得一个NULL指针。
答案 1 :(得分:1)
您要做的事情称为向下倾斜。有关详细信息,请查看this answer。
答案 2 :(得分:0)
没有从Base*
到Derived*
的隐式转换。那是因为指向Base
的指针不必指向Derived
对象。如果您确定这样做,请使用static_cast
:static_cast<Derived*>(base_pointer)
。如果您不确定,Base
至少有一个虚拟功能,请使用dynamic_cast
:dynamic_cast<Derived*>(base_pointer)
;如果指针指向类型为Derived
的对象,它将执行转换,如果不指针,它将返回空指针。
答案 3 :(得分:0)
正如评论中所建议的那样,问题是关于QSharedPointer
,转换Base*
到Derived*
的一般答案不适合这种特殊情况。
在Qt文档中潜水,我们发现了QSharedPointer
,staticCast
的有趣成员方法。
首先,我想出了这段代码:
QSP<Derived> inpf_filter = my_base_QSP->staticCast<Derived>() ;
由于我的QSP
是指针类型,因此我->
以上的staticCast()
不在QSP
上,而是在指针上。所以,我再次遇到错误:staticCast()
不是Base
类的成员。我纠正了
QSP<Derived> inpf_filter = my_base_QSP.staticCast<Derived>() ;
并编译。 QSharedPointer
也支持dynamicCast()
。在此,如果无法执行强制转换,则返回空指针。
答案 4 :(得分:0)
QSharedPointer
有一整套投射机制:
http://qt-project.org/doc/qt-4.8/qsharedpointer.html#qSharedPointerCast
对于QSharedPointer<U>
:
QSharedPointer ( const QSharedPointer<T> & other )
QSharedPointer<X> constCast () const
QSharedPointer<X> dynamicCast () const
QSharedPointer<X> objectCast () const
QSharedPointer<X> staticCast () const
如果T
是U
的子类型,则构造函数有效。
const
,dynamic
和static
投射的工作方式类似于C ++的_cast
运算符。
object
执行qobject_cast
。
如果将结果存储在另一个共享指针中,对共享指针类型执行_cast
运算符通常是一个坏主意 - 为了安全地转换非侵入式共享指针,您需要共享 - 指针识别铸造。