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

kir*_*off 2 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) ;
Run Code Online (Sandbox Code Playgroud)

我有错误

Error 1 error C2440: 'initializing' : cannot convert from 'Base *' to 'Derived *'
Run Code Online (Sandbox Code Playgroud)

my_base_pointer类型const QSP<Base>.

是因为常数吗?我应该const_cast吗?我认为constness不是根本原因,因为如果我

const QSP<Derived> inpf = static_cast<const QSP<Derived>>(my_base_pointer);
Run Code Online (Sandbox Code Playgroud)

发生同样的错误.

Mar*_*som 6

你正在给QSP<Derived>构造函数一个Base*指针,这将无法工作.只要你确定指针确实是一个Derived*你应该能够static_cast它:

QSP<Derived> inpf = QSP<Derived>(static_cast<Derived*>(my_base_pointer)) ;
Run Code Online (Sandbox Code Playgroud)

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