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调用。