The way you do is ok:
ABall* Ball = Cast<ABall>(OtherActor);
You just need to check Ball before using it:
if (Ball)
{
Ball->Destroy();
}
For the player also works:
ASoccerGameCharacter* Player= Cast<ASoccerGameCharacter>(OtherActor);
But, without checking the result of the cast, you won’t know if the OtherActor is a Ball or the Player.
This is C++. Assumptions = crash. I’m sure about X = crash.