Polymorphism can be static or dynamic. In static polymorphism, the response to a function is determined at the compile time. In dynamic polymorphism, it is decided at run-time.
The mechanism of linking a function with an object during compile time is called early binding. It is also called static binding or early binding.
Runtime polymorphism has method overriding that is also known as dynamic binding or late binding.
Abstract classes contain abstract methods, which are implemented by the derived class. The derived classes have more specialized functionality. Dynamic polymorphism is implemented by abstract classes and virtual functions.