Just to chime in to the already good answers. Here is a real-world example. Developing very interesting Domain Specific Language at work:
- Inheritance used for Abstract Syntax Tree
- Visitor pattern used for operations on the AST
- Simple, single or limited purpose classes with occasional functions for manipulating their data used here and there (such as symbol table or scope tracking)
- Procedural style constitutes the other 95% of code. Specifically, in many problem domains there is a struct which holds current "context" plus functions which read/write it.
The final point above has actually been the most important design decision because other coding styles are usually much harder to refactor. As the project grows, ability to refactor even major portions quickly has allowed it to mature efficiently.