Search code examples
c++inheritanceoverloadingdynamic-binding

C++ function overloading and dynamic binding compile problem


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.


Solution

  • 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; }
    };