C++ 将基数*转换为派生*和恒常性
C++ conversion Base* to Derived* and constness
是否总是允许从Base*
转换为Derived*
?是否始终允许从const Base*
转换为const Derived*
?
我正在使用Qt QSharedPointers。我有一个指向Base
对象的 QSharedPointer ,我想将其转换为指向Derived
对象的 QSharedPointer 。我事先检查了 pointee 是 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 *'
具有 const QSP<Base>
型my_base_pointer
。
是因为恒常吗?我应该const_cast在上面吗?我想恒常性不是根本原因,因为如果我
const QSP<Derived> inpf = static_cast<const QSP<Derived>>(my_base_pointer);
发生相同的错误。
您正在为 QSP<Derived>
构造函数提供一个Base*
指针,这将不起作用。只要你确定指针确实是一个Derived*
你应该能够static_cast它:
QSP<Derived> inpf = QSP<Derived>(static_cast<Derived*>(my_base_pointer)) ;
如果基类至少有一个虚函数,则在这种情况下使用 dynamic_cast
会更安全,因为这是创建基类的目的。如果指针实际上不是指向派生类的指针,您将获得一个 NULL 指针。
你试图做的事情被称为向下投掷。有关详细信息,请查看此答案。
没有从 Base*
到 Derived*
的隐式转换。这是因为指向Base
的指针不必指向Derived
对象。如果您确定可以,请使用 static_cast
: static_cast<Derived*>(base_pointer)
。如果您不确定,并且Base
至少有一个虚函数,请使用 dynamic_cast
: dynamic_cast<Derived*>(base_pointer)
;如果指针指向类型为 Derived
的对象,这将执行转换,如果没有,它将返回一个空指针。
正如评论中所建议的,问题是关于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()
。在这种情况下,如果无法执行强制转换,则返回空指针。
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
如果构造函数是 U
的子类型,则构造函数有效T
。
const
、dynamic
和static
演员的作品就像C++的_cast
操作员一样。
object
做一个qobject_cast
.
如果将结果存储在另一个共享指针中,则对共享指针类型执行_cast
运算符通常是一个坏主意 - 为了安全地强制转换非侵入式共享指针,您需要执行共享指针感知强制转换。
- const_cast静态数组以添加恒常性
- 自动模板参数、数据成员和恒常性
- 有没有办法检测自身内部的类恒常性?
- 为什么const_cast删除指针的恒常性,而不删除指向常量的指针的恒常性?
- 对指针和恒常性兼容性的引用
- 自定义容器中的括号运算符中的恒常性
- C++ 重载分辨率和恒常性
- C++17类模板演绎常性
- C++ 函数匹配和恒常性
- 如何忽略函数模板中的恒常性?
- 常量自动和对象恒常性
- 比较运算符 == 中的共享指针恒常性
- 添加额外的恒常性会导致编译器错误
- 删除模板化函数中的恒常性
- 无法正确理解我的恒常性
- 模板转换运算符优先级和恒常性
- const_iterator和恒常性const_iterator::value_type
- 使用const_cast来添加恒常性 - 坏主意?
- C++ 逻辑恒常性和 const方法的按值返回
- C++ 将基数*转换为派生*和恒常性