Understand subtype polymorphism in C++/Java