- interface/API based -- this is supported in modern languages via interfaces, traits, etc.
- implementation/code based -- modern languages tend to only support single inheritance; they tend to also support default method implementations on the interfaces/traits
Those are actually mechanisms for achieving polymorphism.
Inheritence inherently (heh) consists of "inheriting" parent class' internals and having ability to extend them. It is basically composition, polymorphism and monkeypatching in a trench coat.
- interface/API based -- this is supported in modern languages via interfaces, traits, etc.
- implementation/code based -- modern languages tend to only support single inheritance; they tend to also support default method implementations on the interfaces/traits