Shadowing virtual functions is considered very bad practice in general.
That said, I have a hard time knowing where the questions and your answers are in your post.
Shadowing is a matter of lookup. Given base, A and B from situation 1:
Code:
B *pb = new B();
A *pa = pb;
base *pbas = pa;
// Too lazy to correct my typo from foo to func now.
pb->func(); // Valid, calls B::foo()
pb->func(1); // Valid, calls B::foo(int)
pb->func(1, 2); // Valid, calls B::foo(int, int)
pb->func(1, 2, 3); // Invalid, A::foo(int, int, int) is hidden
pa->func(); // Invalid, base::foo() is hidden
pa->func(1); // Invalid, base::foo(int) is hidden
pa->func(1, 2); // // Invalid, base::foo(int, int) is hidden
pa->func(1, 2, 3); // Valid, calls A::foo(int, int, int)
pa->base::func(1, 2); // Valid, but beware! Calls base::func(int, int), not B::func(int, int)!
pbas->func(); // Valid, calls B::foo()
pbas->func(1); // Valid, calls B::foo(int)
pbas->func(1, 2); // Valid, calls B::foo(int, int)
pbas->func(1, 2, 3); // Invalid, No such function in base.
For situation 2:
Code:
pa->func(); // Invalid, base::func() is hidden
pa->func(1); // Valid, calls A::func(int)
pa->func(1,2); // Invalid, base::func(int, int) is hidden
pbas->func(); // Valid, calls base::func()
pbas->func(1); // Valid, calls A::func(int)
pbas->func(1, 2); // Valid, calls base::func(int, int)