Where-as the number of classes with virtual functions in any given project I can often count on one hand
OO teaches that you should default to composition as a default choice, and only use inheritance where truly needed and composition doesn't suffice. Virtual functions therefore should be quire rare in (statically typed) OOP code.
IMHO it was crazy for Java to default every function to being virtual, and for it to be encouraging a crazy amount of inheritance (both interface and implementation kinds). They've raised a whole generation of programmers who believe that implementation inheritance is the correct default tool for writing reusable code...
But yes, C++ is not an OO-specific language. It's multi-paradigm, letting you mix procedural, OO, generic, functional, meta-programming and probably other paradigms, within a statically-typed & pre-compiled framework.
One outgrowth of OOP are these static class methods used for math, instead of having global functions. What is the means of writing Math.Sin(x), instead of sin(x)? This is ridiculous in my eyes. Luckily, we don't have this nonsense in C++.
That's not an issue with OO itself; that's an issue with Java's perversion of OOP.