I am trying to get a set of rules in my head that will predict any polymorphic situation. This may take a while! In the above example, I was thinking like this: if pointer of type B points to derived object C, the call B->f2 doesn't care about C::f2 because B::f2 is not virtual, so it doesn't look for any overriding functions in the C object that B is pointing to. Hence B->f2 shows B:f2. Same with call A->f2, A::f2 not virtual so A->f2 calls A::f2 even though there is in derived C a C::f2 and A is actually pointing to a C object. So far, so good, my little rule works.
But then I see B->f1 goes to the overriding C->f1, even though B::f1 is not declared as virtual. Given, it is a bad idea to mask B::f1 with C::f1, but I would not predict B->f1 would go to C->f1, especially since A-f2 does not go to C->f2.
I think I'm going to have to completely understand what happens in V tables to really understand polymorphism?
I did not know this, learned something new again. So even though B::f1 does not inherit any part of the function logic in the body of A::f1, it DOES inherit the "virtual" attribute of A::f1. And that virtual attribute will propagate down through all derived, derived of derived, etc... classes, even if none of them are declared as virtual.
Is there anything else a derived function can inherit from a virtual base class function of same name and argument list, if both have different 'body of the function' definitions (other than "virtual")?
No, the derived class gets from its base class the declaration of the virtual function (name and argument types) which remains virtual and, if missing, it also has the same body as the base class.