First of all, read about the basics:
http://en.wikipedia.org/wiki/Object-based_language[
^],
http://en.wikipedia.org/wiki/Object-oriented_programming[
^].
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, see:
http://en.wikipedia.org/wiki/Dynamic_dispatch[
^],
http://en.wikipedia.org/wiki/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.
—SA