Okay, this one is weird.
Here is an example:
Because B has a public inheritance of A, one would think that void A::m1(int) should be exposed as public in class B. Consequently, line 17 should have been allowed. However, the compiler disagrees, when complains that it cannot convert from int to char*.
In this case, void A::m1(int) is hidden because of void B::m1(char *). If you remove the definition of void B::m1(char *) from class B, then line 17 compiles. Of course, in that case, line 18 will cause a compile-time error.
The problem occurs because when a subclass overrides a method name of a superclass, the compiler makes all of the methods (overloaded) of the same name in any superclass inaccessible. This is done to avoid any unintentional use of superclass methods.
In our example, if we are really sure that we want to use void A::m1(int) on line 17, then we can change the definition of class B to reexpose that method:
Line 24 reexposes void A::m1(int) so that it is accessible again. Note that this inline definition is permitted.