For a correct oop language...
you should try smalltalk. Java is the descendant of c and smalltalk, not c++. Actually as long as c++ doesn't have a standard typeof() functionality or some form of dynamic classing (like the nonstandard microsoft class interface extension), it's very painful to write dynamic programs. C++ is a statically linked language, with such misfeatures as having static classes, class pointers and class references with different syntax and no proper unified interface. Not to mention the lack of dynamic interface types and proper property support. (all available as proprietary extensions in various microsoft products and as completly incompatbible variants in other compilers)
The only truely supported standard language is c. You can write good oop code in c, and it's not really harder if you have a properly typed macro preprocessor (aka. template support).
ps: Why kernel developers avoid c++? Because in c++ you can't make all memory allocations explicit or if you do, you end up with plain c. And in a classic kernel, you have to jump through various loops to get even the smallest amount of memory allocated. This is true for most kernels, including the winnt line, linux or bsd.