检查A是否是B的子类?

时间:2014-03-24 12:43:21

标签: c++ unreal-engine4

我目前正在使用虚幻引擎4,似乎我无法避免某些演员阵容。

AController* c = this->GetController();
APlayerController* p = (APlayerController*)c;

在我进行演员表之前,有没有办法可以检查c是否为PlayerController

2 个答案:

答案 0 :(得分:7)

如果类至少有一个虚函数(可能),则可以使用dynamic_cast

APlayerController* p = dynamic_cast<APlayerController*>(c);

如果c在运行时实际上不是正确类型,则返回空指针。

编辑除了至少一个虚拟功能外,dynamic_cast还需要在您的构建中启用运行时类型信息(RTTI)。它通常是语言的一部分,但编译器可以支持将其关闭。

答案 1 :(得分:5)

与许多游戏引擎一样,出于性能原因,虚幻引擎在没有RTTI的情况下进行编译,因此dynamic_cast将无效。

虚幻引擎提供了自己的替代方案,简称为Cast。我现在无法找到任何文档,但this question很好地描述了它的用法。

AController* c = this->GetController();
APlayerController* p = Cast<APlayerController>(c);
if (p) {
    ...
}

AController还有一个便捷方法CastToPlayerController,它会做同样的事情:

AController* c = this->GetController();
APlayerController* p = c->CastToPlayerController();
if (p) {
    ...
}

如果您确定c始终是APlayerController,那么CastChecked会更有效率:

AController* c = this->GetController();
APlayerController* p = CastChecked<APlayerController>(c);
...

在调试版本中,这将使用Cast并抛出一个断言,如果它将返回null;在发布版本中,它会解析为快速static_cast