OOP means different things to differnt people.

At the lowest level it means writing classes that encapsulate data and behavior. But from there people can get drunk on the basics and then go overboard too. How far is too far is very subjective though, and fundamentalism at both extremes is a mistake.

Inheritance is hardly a requirement for object oriented programming. VB6 for example uses COM's interface implementation approach for similar purposes, which can generate far more efficient object code and be more maintainable over time than inheritance models.

However the more slovenly inheritance approach is easier for beginners and can be more powerful, so .Net offers both options.