Name hiding is a feature of C++. Quoting from C++ FAQs by Marshall P. Cline and Greg A. Lomow :
What is the hiding rule? A member of a derived class hides any member of a base class that has the same name as the derived class member.
Here's an example of the problem:
class Base
{
public:
virtual void foo( int const & x ) { m_foo = x; },
virtual int foo( void ) const { return m_foo; },
private:
int m_foo;
},;
class Derived : public Base
{
public:
virtual void foo( int const & x ) { Base::foo( x ); DoFooChanged(); },
void DoFooChanged( void ) {},
},;
Derived d;
cout << d.foo(); // COMPILER ERROR int foo( void ) is hidden.
In post-standard C++ one would fix the problem with a using-declaration like:
class Derived : public Base
{
public:
using Base::foo;
// ... as before
},;
This brings the foo of the base scope into the derived scope. In practice this is only a slight inconvenience in situations like this. -- DaveHarris