Думаю, надо выделить несколько направлений использования ООП.

1. ООП как средство создания новых типов данных в языке программирования. Крайняя степень этого - новые типы данных не должны отличаться от старых. Эта точка зрения принята в С++.
Другая точка зрения - минималистская - принята в Обероне.
Но с этим справлялись и абстрактные типы данных.

2. Частично к созданию новых типов  можно отнести наследование, поскольку в данном случае тоже конструируется новый тип данных. Происходит развитие типов данных в нужном направлении.
Однако вторая ипостась наследования - консервативная. Сохранение уже написанного кода.
Однако с этой ролью вполне справляются и модули - без всякого наследования.

3. Именно при наследовании и требуется динамическое связывание. Без него динамический тип - это уже динамическая типизация в языке (Perl, Python, Ruby и т.д.).
Таким образом, получается, что наследование - это важнейшая часть ООП.