I understand that dynamic/static polymorphism depends on the application design and requirements. However, is it advisable to ALWAYS choose static polymorphism over dynamic
Static polimorphism may provide significant advantage if the called method may be inlined by compiler. For example, if the virtual method looks like this:
protected:
virtual bool is_my_class_fast_enough() override {return true;}
then static polimophism should be the preferred way (otherwise, the method should be honest and return false :).
"True" virtual call (in most cases) can't be inlined.
Other differences(such as additional indirection in the vtable call) are neglectable
[EDIT]
However, if you really need runtime polymorphism (if the caller shouldn't know the method's implementation and, therefore, the method can't be inlined on the caller's side) then do not reinvent vtable (as Emilio Garavaglia mentioned), just use it.