Possible Duplicates:
C++ method only visible when object cast to base class?!
Why does an overridden function in the derived class hide other overloads of the base class?
#include <iostream>
using namespace std;
class A
{
public:
virtual void foo(void) const { cout << "A::foo(void)" << endl; }
virtual void foo(int i) const { cout << i << endl; }
virtual ~A() {}
};
class B : public A
{
public:
void foo(int i) const { this->foo(); cout << i << endl; }
};
class C : public B
{
public:
void foo(void) const { cout << "C::foo(void)" << endl; }
};
int main(int argc, char ** argv)
{
C test;
test.foo(45);
return 0;
}
The above code does not compile with:
$>g++ test.cpp -o test.exe
test.cpp: In member function 'virtual void B::foo(int) const':
test.cpp:17: error: no matching function for call to 'B::foo() const'
test.cpp:17: note: candidates are: virtual void B::foo(int) const
test.cpp: In function 'int main(int, char**)':
test.cpp:31: error: no matching function for call to 'C::foo(int)'
test.cpp:23: note: candidates are: virtual void C::foo() const
It compiles if method "foo(void)" is changed to "goo(void)". Why is this so? Is it possible to compile the code without changing the method name of "foo(void)"?
Thanks.
The problem is, that inheritance is not carried over different namespaces. So to make it compile, you have to tell the compiler with the using directive:
class B : public A
{
public:
using A::foo;
void foo(int i) const { this->foo(); cout << i << endl; }
};
class C : public A
{
public:
using B::foo;
void foo(void) const { cout << "C::foo(void)" << endl; }
};