An interesting polymorphism behavior/mis-behavior?

In reply to kernalmode1:

In variant 2, A::showMsg is non-virtual. The code calling a.showMsg must behave as non-virtual because is has no knowledge the class will be extended. That means A::showMsg could have a completely different prototype from B::showMsg if you wanted (i.e. a different number of argument). But once B::showMsg is declared virtual, all derived methods are virtual and must have the same prototype.