Look, most OO languages are going to contain your procedural code; although the code will be organised into objects.
Objects are intended to mimic real world objects, for example:
You have an object that is an animal (this is our class). You also have objects that are cows and dogs (these are subclasses). Since cows and dogs are both animals they have similar characteristics; they both inherit some characteristics from this animal object. However, cows and dogs are not the same thing, but they do have the same parent (namely they are both animals).
Now, for example we can say that all animals have four legs and the make some sort of a noise. These are attributes of an animal, or rather your class variables. We know that every animal has four legs, but we don't know what noise they make (only that they make a noise).
So since the cow is an animal it has four legs and makes a noise. When we define the cow object we say the type of noise is a "moo". Similarly with the dog, it has four legs and makes a noise, which is a "woof". Since the noise attribute is different for a cow and dog they are not the same thing.
Notice how in the above example we never need to say that a dog or cow has four legs? That is because they are types of animal, and we know ALL animals have four legs. As such we save on programming time, and possible errors, by reusing parts of the parent (animal) object/classes and only defining in the child (dog, cow) subclasses the parts that make them different.
Easy peasy
EDIT: if you had been using a purely procedural language you would need to define everything about the dog and cow (and cat, and horse, and sheep) every single time.