Inheritance and polymorphism are the two defining characteristics of object-oriented languages and we'll explore them here a bit to see how they turn up in MAX and MAXScript. First and foremost, both characteristics depend on the system having a well defined type, or class, for every value. This divides up all the values you can work with into groups each of which have well defined operations and properties for their values. In some languages, like standard C++, the class is only manifest at compile-time. In others like Smalltalk and MAXScript, the classes are actual runtime entities and every value has a runtime 'tag' that says what class it is. This is the main reason that MAXScript can have type-free variables - it can look at the class-tag of the value in a variable at runtime to see what the class is.
We've been using a somewhat neutral convention so far of calling the things you compute with 'values'. The term for these things in object-oriented languages is, not surprisingly, object. The terms object and value are synonymous as far as this document is concerned.
Once you have a grouping of objects into classes, you can start arranging the groups themselves into hierarchies. We do this all the time, of course, in real life - the classic example is the biological hierarchy, arranging us all hierarchically into animals and plants and mammals and vertebrates and humans and adults and children, etc. An object-oriented language provides a way to arrange value classes into hierarchies like this, and like the hierarchies we are used to, a class at some point in the hierarchy shares all the operations and properties of all its parent classes. This sharing is known as inheritance in object-oriented languages and it has a substantial impact on the way code is built. You only need to code the operations and properties once for a class high up in the hierarchy and then all the descendant classes automatically get those operations and properties. At each point in the inheritance hierarchy you only need to code those things that are special about the new class. This can be an enormous saving if you choose the hierarchy well.
In the MAXScript Class Hierarchy topic, all the built-in classes in MAXScript are laid-out in their place in the hierarchy so you can see who inherits what from whom. Some of the hierarchy comes from within MAX itself. It is internally object-oriented, and all the objects and modifiers and controllers and so on are arranged in a well-defined inheritance heirarchy.
The other thing you can do once you've got values arranged into identifiable classes is start factoring and simplifying the symbology for all the different kinds of operations each class can do. The classic example of this comes from mathematics. The symbolic operators '+' and '-' and '*' and '/' are shared among many different types (integers, reals, complex, vectors, matrices, etc.), and do the right thing depending on the types they are applied to. This capability for a single named operation to work on different types is called polymorphism. Object-oriented languages let you use the same name for a bunch of different functions or operators across different classes, and it figures the right one to use depending on the class of the value you are using at any point.
In MAXScript, all the math operators and functions are polymorphic in this sense and reflect the standard mathematical conventions. An interesting example for MAX use is the random() function. It takes 2 arguments and generates a random value between them. So, if you give it floats it gives you a float back, if you give it 3d points, it gives you random a point in the box they define the corners of, if you give it quaternions, it gives you back a random rotation between them, etc.
Further, all the functions that work on MAX objects are polymorphic within their hierarchies. So moves and hides and selects work on all kinds of scene objects, time scaling and insertion work on all the kinds of controllers, etc.