One common description of Object orient languages is that they use “Duck Typing.” The idea is the if it looks lie a duck, walks like a duck, and sounds like a duck, you can treat it like a duck. Java and C++ typically are set in opposition to Duck Typing: You must have a complete Symbol match in order to be treated like a duck.
C++ is not Duck typed at run time, but it might be helpful to think in terms of Duck typing at compile time; Template programming is based on the Duck principal. In C++, this is called the implied interface. A Template only cares that the type passed in as the typename has a member that matches the template. The major difference here is that in Object Oriented Languages, this distinction is made at Run Time. In C++, the distinction is made at Build time.
One rule of thumb that I have found useful in understanding the difference in approach between Java and C++ is this: Java assumes that Code will be reused without a recompile. C++ Assumes that the compiler will be involved in a recompile. Note that I say C++, and I mean Bjarne Stroustrup and the STL developers. Not COM, CORBA or many of the Languages build in C++ but on top of the language. I’m not saying I approve or disapprove of this approach, just that it is a valuable way to think about the language.