I think maybe the confusion is that he's thinking "Well, stupid compiler, can't it SEE that the thing is a Derived even though it's being pointed to by a Base *?" Yes, it can see that... And it might even forgo the virtual call in that case... But in most cases the compiler CANNOT see that.
Here, maybe this will hammer it in:
Code:
int main()
{
Base *b;
if (rand() % 2 == 0)
b = new Base();
else
b = new Derived();
b->Print();
}
Okay, NOW the compiler CANNOT possibly know the type of the object -- I'm determining it RANDOMLY. In THIS case how is the compiler supposed to know what type the object is?