多态是面向对象的三大特性之一,它是指通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为。UE4实现多态,可以有两种方法,结果也不一样,下面结合代码介绍指针对象的多态,引用方法也是同理,不在赘述。

方法1

CPP虚函数的方法

  1. // Fill out your copyright notice in the Description page of Project Settings.
  2. #pragma once
  3. #include "CoreMinimal.h"
  4. #include "UObject/NoExportTypes.h"
  5. #include "MyObject.generated.h"
  6. /**
  7. *
  8. */
  9. class TESTCPP_API UMyObject : public UObject
  10. {
  11. GENERATED_BODY()
  12. public:
  13. UMyObject();
  14. UFUNCTION(BlueprintCallable)
  15. void polymophic();
  16. };
  17. class Fmyclass {
  18. public:
  19. Fmyclass() { UE_LOG(LogTemp, Warning, TEXT("Hellow Fmyclass")); }
  20. virtual void testFun() { UE_LOG(LogTemp, Warning, TEXT("Test Fmyclass")); }
  21. ~Fmyclass() { UE_LOG(LogTemp, Warning, TEXT("Dead Fmyclass")); };
  22. };
  23. class F2Thclass :public Fmyclass{
  24. public:
  25. F2Thclass(){ UE_LOG(LogTemp, Warning, TEXT("Hellow F2Th ")); }
  26. void testFun() { UE_LOG(LogTemp, Warning, TEXT("Test F2Th")); }
  27. ~F2Thclass() { UE_LOG(LogTemp, Warning, TEXT("Dead F2Th")); };
  28. };
  1. void UMyObject::polymophic()
  2. {
  3. //实现多态
  4. TSharedPtr<Fmyclass> ptrObject = MakeShareable(new F2Thclass);
  5. if (ptrObject.IsValid()) {
  6. //CPP常规方法
  7. ptrObject->testFun();
  8. //
  9. }

image.png

方法2

用StaticCastSharedPtr函数方法实现cast父子转换,注意下面警告。

  1. void UMyObject::polymophic()
  2. { //也可以用父类转派生类实现多态
  3. //声明初始化不能直接cast,
  4. //例如:TSharedPtr<Fmyclass> ptrObject2=StaticCastSharedPtr<F2Thclass>(ptrObject2);
  5. TSharedPtr<Fmyclass> ptrObject2;
  6. StaticCastSharedPtr<F2Thclass>(ptrObject2);
  7. if (ptrObject2.IsValid()) {
  8. ptrObject2->testFun();
  9. };
  10. }

image.png

总结:

区别与传统CPP的多态,方法二更加灵活,个人认为它属于伪多态。