【问题标题】:Problems with overriding functions覆盖函数的问题
【发布时间】:2019-06-09 22:57:19
【问题描述】:

我正在制作 FPS 游戏,现在正在添加机器人。我遇到了一个显示覆盖问题的函数的问题。问题在于虚空——拥有。

我没试过。

/****
*this is .h file
*****/
 #pragma once

 #include "CoreMinimal.h"

 #include "AIController.h"

 #include "Engine.h"

 #include "AI_Controller.generated.h"


UCLASS()

class TEST_API AAI_Controller : public AAIController
{

GENERATED_BODY()

public:

    AAI_Controller();

        virtual void BeginPlay() override;

        virtual void Possess(APawn* Pawn) override;

        virtual void Tick(float DeltaSeconds) override;

        virtual FRotator GetControlRotation() const override;

        UFUNCTION()
            void OnPawnDetected(const TArray<AActor*> &DetectedPawns);

        UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = AI)
            float AISightRadius = 500.0f;

        UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = AI)
            float AISightAge = 5.0f;

        UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = AI)
            float AILoseSightRadius = AISightRadius + 50.0f;

        UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = AI)
            float AIFieldOfView = 90.0f;

        UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = AI)
            class UAISenseConfig_Sight* SightConfig;

};

我希望 void Possess 能够正常工作而不会出现任何错误,因为我在我的代码中没有发现任何错误,我认为它应该可以工作。它显示了这个错误 - 'AController::Possess':声明为'final'的函数不能被'AAI_Controller::Possess'覆盖

如果有人能解释发生了什么以及如何解决这个问题,我将不胜感激。

【问题讨论】:

  • 错误说明了一切。基类函数被声明为 final,这意味着你不能覆盖它。你需要删除final,或者如果你不能,找到另一种方法来做你想做的事情。
  • 但是我如何删除final呢?
  • 我猜你不会。必须有另一种方法来做你想做的事。
  • 仍然,感谢您的帮助。我这周必须完成这个代码部分,但我遇到了这个错误......我希望有人能帮忙解决这个问题
  • 谁编写了AAIController 类?

标签: c++ class void unreal-engine4


【解决方案1】:

函数是最终函数的原因是因为它是虚幻引擎 v4.22 中已弃用的函数。我不建议修改它,甚至根本不使用它。而是使用 OnPossess 和 OnUnpossess,一切都应该正常。

virtual void OnPossess(APawn* InPawn) override;
virtual void OnUnPossess() override;

【讨论】:

    【解决方案2】:

    问题在于AController::Possess() 的声明已被声明为final,因此编译器会阻止您覆盖AAI_Controller 中的函数。

    您可以转到声明类 AController 的位置并删除 final 关键字,例如: virtual void Possess(APawn* pawn) finalvirtual void Possess(APawn* pawn) 这将消除错误。不过,您应该小心这样做,如果您没有编写基类,那么首先将函数声明为 final 可能是有充分理由的

    或者,如果您不能这样做并且您可以更改函数签名,只需创建自己的函数,该函数不会覆盖基本成员函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多