How to handle damage with multiple types, using functions?

I would make a base class with the common functionality, and then add virtual functions to extend in the base class.

I would then inherit from the base class and add functionality to the child classes that are specific to the element type.

Damage is common to all of the functions, and “freeze time” could be abstracted to “effect time”.

I’m not a blueprints guy, but this would be fairly straightforward in C++.