Here's an interesting exercise: try to find the definition of the function buffer_eopnotsupp() in the kernel. Hint: it's defined by using a macro, along with the functions set_buffer_eopnotsupp() and clear_buffer_eopnotsupp(). This is the kind of thing that object-oriented languages should be good at.
Another example that is quite common: the use of function pointers is frequently accomplishing the exact same goal as having derived objects, but less cleanly. It also limits the ability of the compiler to optimize cases where the actual function is known, and therefore could be inlined or even eliminated entirely.
Does that mean that C++ is the answer? No. And, in spite of having actually used a number of other languages for real world projects, I don't know of anything better. I do think, however, that Linux is out-growing C and that we have an opportunity and a need to figure out something better.
[Answer to the exercise: See the macro BUFFER_FNS in include/linux/buffer_head.h]