If your a procedural man you think about a problem algorithmically -- i.e., what primitives do I need to use in a linear fashion to solve a problem. Your unit of modularization is a procedure/function.
Once you move to OOP your unit of abstraction becomes the object. Objects are at a higher level of abstraction and have the ability to model problems much better.
Each function may now be localized to an object (the functions state) -- in contrast to procedural programming where you have to keep global state, or have to provide references to state. Collections of functions and their state make up an object intrinsically.
Now for an example: Say you had to animate a man in some graphics software -- if it has OOP features you need to create a model of the main in terms of objects.
class man
{
leg leftLeg;
leg rightLeg;
arm leftArm;
arm rightArm;
head _head;
}
Now if you wanted to move the man forward by one step the following might be an implementation of this method:
progressStepRight()
{
leftLeg.moveForward();
rightLeg.moveForward();
rightArm.movebackward();
leftArm.moveForward();
}
A man represents a torso and is composed of arms,legs, and a head (it is represented in-terms-of these items). You tell a man to move and the man object manages its legs and arms -- each arm and leg may have its own state (state is encapsulated by an object). For example the positions of the legs -- I just showed you the method which progressed the entire body Right -- however the legs and arms might know their positions (as their object state) so we could replace the position based methods with a simple move method:
Each of the limbs needs to move -- and its behavior is if limb is left then move limb forward right else move forward left
. All four limbs share this behavior -- arms and legs are limbs!!. The OO world allows would allow you to specify that arms and legs are limbs, and by doing this the arms and legs will inherit the behavior of a limb.
--edit (after comment) --
However, if arms and legs begin to differ (during the evolution of the code) then it is best for a leg and an arm not to inherit any behavior from a limb -- but to implement the interface of the limb (they can still "move" but they do it in different ways).
-- edit/end --
If you were to implement the man's animation procedurally it would be a linear representation of what needs to happen, this source code representation has a lot less inferable knowledge than its OO counterpart. An OO representation is a lot more self-explanatory, and when you come back a few months later you should be able to understand and alter your algorithm much more quickly.