2

是否始终允许从Base*to转换?是否始终允许Derived*const Base*to转换?const Derived*

我正在使用 Qt QSharedPointers。我有一个要Base对象的 QSharedPointer,我想将其转换为Derived对象的 QSharedPointer。我事先检查 pointee 是 type 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>

是因为 constness 吗?我应该在此之上使用 const_cast 吗?我猜 constness 不是根本原因,因为如果我

const QSP<Derived> inpf = static_cast<const QSP<Derived>>(my_base_pointer);

发生同样的错误。

4

5 回答 5

6

您正在为QSP<Derived>构造函数提供一个Base*指针,该指针不起作用。只要您确定指针确实是 aDerived*您应该能够对其进行 static_cast :

QSP<Derived> inpf = QSP<Derived>(static_cast<Derived*>(my_base_pointer)) ;

如果基类至少有一个虚函数,那么dynamic_cast在这种情况下使用会更安全,因为它就是为此而创建的。如果指针实际上不是指向派生类的指针,您将得到一个 NULL 指针。

于 2013-04-22T18:59:08.530 回答
1

你正在尝试做的事情被称为downcast。有关详细信息,请查看此答案

于 2013-04-22T18:59:22.980 回答
0

没有从Base*to的隐式转换Derived*。那是因为指向的指针Base不必指向Derived对象。如果您确定确实如此,请使用static_cast: static_cast<Derived*>(base_pointer)。如果您不确定,并且Base至少有一个虚函数,请使用dynamic_cast: dynamic_cast<Derived*>(base_pointer); 如果指针指向 type 的对象,this 将进行转换Derived,否则将返回空指针。

于 2013-04-22T18:59:25.657 回答
0

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

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

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

QSP<Derived> inpf_filter = my_base_QSP->staticCast<Derived>() ; 

由于 myQSP是指针类型,因此我不在指针->上调用,而是在指针上调用。所以,我又犯了一个错误:不是班级成员。我改正为staticCast()QSPstaticCast()Base

QSP<Derived> inpf_filter = my_base_QSP.staticCast<Derived>() ; 

这会编译。QSharedPointer也支持dynamicCast()。在这种情况下,如果无法执行强制转换,则返回空指针。

于 2013-04-22T20:32:14.087 回答
0

QSharedPointers 拥有一整套强制转换机制:

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,dynamicstatic_castC++ 的运算符一样转换工作。

object做一个qobject_cast

如果您将结果存储在另一个共享指针中,则对共享指针类型执行_cast运算符通常是一个坏主意——为了安全地转换非侵入性的共享指针,您需要进行共享指针感知转换。

于 2013-04-22T20:43:49.187 回答