众所周知 UE4 把 RTTI 给禁止了,这导致 dynamic_cast 的支持是不完全的,也就是说不支持从基类转换到子类,但是在阅读 TSoftObjectPtr (SoftObjectPtr.h) 代码时却看到:
/**
* Dereference the soft pointer.
*
* @return nullptr if this object is gone or the lazy pointer was null, otherwise a valid UObject pointer
*/
FORCEINLINE T* Get() const
{
return dynamic_cast<T*>(SoftObjectPtr.Get());
}
CTRL + 鼠标左键 双击,可以看到 UE 把 dynamic_cast 给 define 了 (震撼小红一整年) 。
#define dynamic_cast UE4Casts_Private::DynamicCast
UE4Casts_Private 命名空间就这一行 define 的上面可以分析出:
- 如果需要转换的类型是 UE 类型即 IInterface 或 UObject ,则转发给 Cast 函数。
- 如果不是第一种情况,则转发给 C++ 原生 dynamic_cast
- 其中对于 指针 和 右值 分开处理,如果是右值 UE 类型,转发给 CastChecked 函数检查。