First of all, read about the basics:
You may find that the notion of "object-based" is not well-defined. This is true. This notion came with some languages which cannot be called truly object-oriented. This is something like Rubic Cube with all facets painted in the same green color. Not rotating. (One may ask: Why green, not some other color? For the military. :-)) One example is VB6.
In my understanding, "object-oriented" is started with the dynamic dispatch
or dynamic binding
and hence, a possibility for late binding
As to the requirement for inheritance
(which is by some reason is called as a primary distinguished object-oriented feature in the the first referenced article), it comes with late binding automatically, because without inheritance nothing is "late". :-)
This is where OOP is started. Next important feature, interfaces, was not initially introduced in OOP, so it is not considered as absolutely required for OOP. Same thing about delegates and events and, finally, reflection. All these features are considered to be integral part of OOP, but not absolutely required. As to generics, they are pretty much unrelated.