Overriding Native or _Implementation

Inside of the UUserWidget Docs there is a bunch of virtual methods.

NativeOnDrop
NativeOnFocusLost

But there is also a bunch of
OnDragOver_Implementation
OnDrop_Implementation

NativeOnDrop
(
const FGeometry& InGeometry,
const FDragDropEvent & InDragDropEv…,
UDragDropOperation* InOperatio…
)

OnDrop_Implementation
(
FGeometry MyGeometry,
FPointerEvent PointerEvent,
UDragDropOperation* Operation
)

My question is why is the second parameter different, and what is the differences between these. I usually use the Native versions and those work but the only way I was able to get my function working was by using blueprint. And the blueprint function signature is using the Implementation version.

UnrealHeaderTool, one that reads those UFUNCTION, UPROPERTY macros and generate code according to it to automatize lot of things, in case of BlueprintNativeEvent needs to define (create code for function) direcly for that function in order to make it blueprints (when you call that event in C++ it needs to trigger this event in blueprints, without that extra code event would be dead in BP), making it impossible to you to write that code as function already exists in generated code, that why UHT genernate decleration of “_Implementation” function which you can override in C++ and add extra code for the event without breaking blueprint event. That what it is when you see “_Implementation”

But this case is special, and all you need to look at is engine code to see what this is all about, you would be also informed on compilation if you would use OnDragOver_Implementation

UFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category="Drag and Drop")
bool OnDragOver(FGeometry MyGeometry, FPointerEvent PointerEvent, UDragDropOperation* Operation);

DEPRECATED(4.8, "Use NativeOnDragOver")
virtual bool OnDragOver_Implementation(FGeometry MyGeometry, FPointerEvent PointerEvent, UDragDropOperation* Operation);

UFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic, Category="Drag and Drop")
bool OnDrop(FGeometry MyGeometry, FPointerEvent PointerEvent, UDragDropOperation* Operation);

DEPRECATED(4.8, "Use NativeOnDrop")
virtual bool OnDrop_Implementation(FGeometry MyGeometry, FPointerEvent PointerEvent, UDragDropOperation* Operation);

And C++ code of those NAtive functions simply calls blueprint events:

bool UUserWidget::NativeOnDragOver( const FGeometry& InGeometry, const FDragDropEvent& InDragDropEvent, UDragDropOperation* InOperation )
{
	return OnDragOver( InGeometry, InDragDropEvent, InOperation );
}

bool UUserWidget::NativeOnDrop( const FGeometry& InGeometry, const FDragDropEvent& InDragDropEvent, UDragDropOperation* InOperation )
{
	return OnDrop( InGeometry, InDragDropEvent, InOperation );
}

So you should override NativeOnDrop and remember to call Super::NativeOnDrop or OnDrop direclly as those functions does in it or else blueprint won’t execute those events, this is also moment when they be executed so wht before this call will before blueprint event do there thing and after will be after those events and all changes they made will be in action.