虚幻 – 关于 dynamic_cast 的冷知识

众所周知 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 的上面可以分析出:

  1. 如果需要转换的类型是 UE 类型即 IInterface 或 UObject ,则转发给 Cast 函数。
  2. 如果不是第一种情况,则转发给 C++ 原生 dynamic_cast
  3. 其中对于 指针 和 右值 分开处理,如果是右值 UE 类型,转发给 CastChecked 函数检查。

发表回复