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