The problem has to do with the lookup rules of C++. The lookup process stops at the first scope where the name is found, i.e., the derived class, without performing a complete overloading resolution. Note that if we declared the two member functions inside class C, the compiler would resolve the call properly.
Fortunately, there is a solution: inject the functions