Question:
I'm surprised the following code doesn't compile:
class C1
{
public:
virtual void f() { /* ... */ }
void f(bool) { /* ... */ }
};
class C2 : public C1
{
public:
void f() { /* ... */ }
};
main()
{
C2 c2;
c2.f(true);
}
I found that adding "using C1::f;" in C2 class solves the problem; however, I see no ambiguity in the call to f.
Answer:
Actually, your compiler is right. The C++ standard says that "a name can be hidden by an explicit declaration of that same name in a [...] derived class" (3.3.7/1). Thus, the f() defined in the derived class hides the one defined in the base class, although the two functions have different signatures. As you said, an explicit using-declaration in the derived class is needed to bring C1::f(bool)as well as any other member named 'f'into the scope of the derived class.