Simply by defining a member function foo in the derived class, you have hidden all of the foo functions in the base class.
You'll need to refine the question a little - are you concerned that the foo in the derived class is not a proper replacement for the foo in the base class? I'm having a hard time trying to determine what you're really asking for.
Edit: Based on your edit and additional comments, I think you have a misunderstanding of how hiding works in C++. In this case, it doesn't matter that one function is const and the other one isn't - once C++ finds a function foo in the derived class, it stops looking anywhere else! This is usually a huge trap for people. Consider the following:
class Base
{
void foo(double d)
{
cout << d;
}
};
class Derived : public Base
{
void foo(int i)
{
cout << i;
}
};
Derived obj;
obj.foo(123.456);
What do you think the output is? It's 123! And you probably got a compiler warning telling you the double value was going to be truncated. Even though the function signature that takes a double is obviously a better match, it's never considered - it has been hidden.