One of the most important aspects is isolation or encapsulation of an entire subunit, so that interference with other units from other vendors can be controlled statically, i.e. without inspecting the actual merger. Component software is extensible by definition, i.e. never complete. While most traditional languages fail to support dynamic polymorphism, many of the object-oriented languages fail to support static encapsulation of units that are comprised of several classes and objects. That is, common object-oriented programming supports some information hiding at the level of classes, but not beyond that. From the above considerations we can draw a set of conclusions.
Polymorphism is at the very heart of, and clearly fundamental to, component-orientation.
Inheritance of code, however, is not fundamental to the nature of components and in fact should be restricted to maintain manageability. Technically, this is nothing new - dynamic link libraries made their way into most modern operating systems. However, on the level of programming this needs to be considered carefully. Late linking truly enables code integration by the client and on demand. In turn, components need to be validated independently and reliance on the final integration test has to be dismissed.