Procedural languages encourage the programmer to think in terms of functions that get passed variables. To put it another way, a procedural programmer manipulated data by calling functions on it. An object-oriented programmer sends messages to data objects telling them to call functions on themselves. Encapsulataion mandates that a class have both data, and the functions that operate on that data.
Inheritance allows a class to inherit from another class.
Polymorphism mandates that daughter classes must be capable of inheriting, but then over-riding certains aspects of the parent class. A typical procedural language needs different functions for each thing that must be closed. In a object-oriented language, a door, box, cabinet, etc may all provide the same interface, saving the programmer a lot of memorization. Additionally, some languages include some but not all of the features of object orientation. Sometimes this is referred to as an object- based language.