多态是面向对象的三大特性之一,它是指通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为。UE4实现多态,可以有两种方法,结果也不一样,下面结合代码介绍指针对象的多态,引用方法也是同理,不在赘述。
方法1
CPP虚函数的方法
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "MyObject.generated.h"
/**
*
*/
class TESTCPP_API UMyObject : public UObject
{
GENERATED_BODY()
public:
UMyObject();
UFUNCTION(BlueprintCallable)
void polymophic();
};
class Fmyclass {
public:
Fmyclass() { UE_LOG(LogTemp, Warning, TEXT("Hellow Fmyclass")); }
virtual void testFun() { UE_LOG(LogTemp, Warning, TEXT("Test Fmyclass")); }
~Fmyclass() { UE_LOG(LogTemp, Warning, TEXT("Dead Fmyclass")); };
};
class F2Thclass :public Fmyclass{
public:
F2Thclass(){ UE_LOG(LogTemp, Warning, TEXT("Hellow F2Th ")); }
void testFun() { UE_LOG(LogTemp, Warning, TEXT("Test F2Th")); }
~F2Thclass() { UE_LOG(LogTemp, Warning, TEXT("Dead F2Th")); };
};
void UMyObject::polymophic()
{
//实现多态
TSharedPtr<Fmyclass> ptrObject = MakeShareable(new F2Thclass);
if (ptrObject.IsValid()) {
//CPP常规方法
ptrObject->testFun();
//
}
方法2
用StaticCastSharedPtr函数方法实现cast父子转换,注意下面警告。
void UMyObject::polymophic()
{ //也可以用父类转派生类实现多态
//声明初始化不能直接cast,
//例如:TSharedPtr<Fmyclass> ptrObject2=StaticCastSharedPtr<F2Thclass>(ptrObject2);
TSharedPtr<Fmyclass> ptrObject2;
StaticCastSharedPtr<F2Thclass>(ptrObject2);
if (ptrObject2.IsValid()) {
ptrObject2->testFun();
};
}
总结:
区别与传统CPP的多态,方法二更加灵活,个人认为它属于伪多态。