多态是面向对象的三大特性之一,它是指通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为。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的多态,方法二更加灵活,个人认为它属于伪多态。
