I think you already understood. Its called Name Hiding and this is how the language is made. But i don't see it as an inconvenience as you get pretty comfortable with these convention eventually when you spend time with C++. When you define a non virtual method with the same name as Base method it hides the Base class method in Derived class so you are getting the error for
obj.methodA();
To avoid hiding of Base class methods in Derived class, you can do :
obj.Base::methodA();
For more info: http://www.programmerinterview.com/index.php/c-cplusplus/c-name-hiding/