In OO, encapsulation extends to procedures as well as data. In other words, a class encapsulates methods as well as attributes. Abstract Data Types apply the same notion. Inheritance is what makes a Class different from an Abstract Data Type. A derived class inherits the methods and attributes of its parent class.
Polymorphism allows different types of objects to behave differently.
A piece of code can invoke an object's method without knowing what kind of object it is. The runtime system automagically selects the method appropriate for the class to which the specific object belongs. Without polymorphism, inheritance would be of limited usefulness. OO is good for implementing a GUI, but not essential. I made up this term myself because I don't know what else to call it.