There are two main types of polymorphism:
Compile-Time Polymorphism (Static Polymorphism): Achieved through method overloading and operator overloading. The method or operator to be invoked is determined at compile time.
Runtime Polymorphism (Dynamic Polymorphism): Achieved through method overriding. The method to be executed is determined at runtime based on the actual object type.