C ++转换Base *到Derived *和constness

时间:2013-04-22 18:54:28

标签: c++ casting compiler-errors const

是否始终允许从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);

发生同样的错误。

5 个答案:

答案 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_caststatic_cast<Derived*>(base_pointer)。如果您不确定,Base至少有一个虚拟功能,请使用dynamic_castdynamic_cast<Derived*>(base_pointer);如果指针指向类型为Derived的对象,它将执行转换,如果不指针,它将返回空指针。

答案 3 :(得分:0)

正如评论中所建议的那样,问题是关于QSharedPointer,转换Base*Derived*的一般答案不适合这种特殊情况。

在Qt文档中潜水,我们发现了QSharedPointerstaticCast的有趣成员方法。

首先,我想出了这段代码:

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

如果TU的子类型,则构造函数有效。

constdynamicstatic投射的工作方式类似于C ++的_cast运算符。

object执行qobject_cast

如果将结果存储在另一个共享指针中,对共享指针类型执行_cast运算符通常是一个坏主意 - 为了安全地转换非侵入式共享指针,您需要共享 - 指针识别铸造。