U++ 运行时类型信息和类型转换
跳到导航
跳到搜索
由于UObject是虚幻引擎反射系统的一部分,它们始终知道它们是哪些UClass,并可以在运行时做出有关类型的决定和类型转换。
在原生代码中,每个UObject类都将自定义Super类型定义设置为其父类,从而可以轻松控制覆盖行为。示例:
class AEnemy : public ACharacter { virtual void Speak() { Say("Time to fight!"); } }; class AMegaBoss : public AEnemy { virtual void Speak() { Say("Powering up!"); Super::Speak(); } };
如你所见,调用Speak将会让MegaBoss说"Powering up!Time to fight!"。
此外,你可以使用模板化Cast函数或者查询(如果Object是使用IsA的特定类)安全地将Object从基类转换为更衍生性类。另一个简短示例:
class ALegendaryWeapon : public AWeapon { void SlayMegaBoss() { TArray<AEnemy> EnemyList = GetEnemyListFromSomewhere(); // The legendary weapon is only effective against the MegaBoss for (AEnemy Enemy :EnemyList) { AMegaBoss* MegaBoss = Cast<AMegaBoss>(Enemy); if (MegaBoss) { Incinerate(MegaBoss); } } } };
这里我们使用了Cast来尝试将AEnemy转换为AMegaBoss。如果所提及Object实际上不是AMegaBoss(或者其子类),则Cast会返回空指针,我们可以适当的做出反应。在以上代码中,Incinerate将仅对MegaBoss调用。