OO is mostly a mind set. You can program OO in C (if you really want to ... ), and you can perfectly have procedural code in C++/Java; what I mean is, even if you use classes on the surface, it could still be procedural.
The idea behind OO is abstraction of state. Instead of "thinking" in terms of "groupings of data", you "think" in terms of "objects", where an object is an "interface" for "grouping of data and ways to manipulate this data".
It all sounds philosophical, because it is.
There's a lot to say here, and it can't be all said in a small SO post, so I'll leave it here.
UPDATE
As mentioned in Flanagan's answer, OO languages implement constructs that utilize this abstraction.
I mean, you could technically "hack" classes and polymorphism in terms of structs, functions, and function pointers.
Here's an example of OO in C