Не удается найти функцию базового класса, если в базовом классе есть две функции с одинаковым именем - PullRequest
6 голосов
/ 20 января 2011

У меня есть базовый класс, который имеет две функции с одинаковыми именами, но с разными сигнатурами в двухуровневом наследовании.

struct A {
    virtual void f(int) { }
    virtual void f(int, int) { };
    virtual void f1(int) { }
};

struct B: public A { };

struct C: public B {
  void f(int, int) { }
  void f1(int) { }
};

int main() {
 C obj;
 obj.f1(0);
 obj.f(0,0);

 obj.f(0);    // (1) cannot be found
 obj.B::f(0); // (2) works

}

Я бы ожидал, что мой компилятор (gcc-4.3.2) найдет правильное определение в (1), но я получу

g++     main.cpp   -o main
main.cpp: In function 'int main()':
main.cpp:20: error: no matching function for call to 'C::f(int)'
main.cpp:10: note: candidates are: virtual void C::f(int, int)
distcc[2200] ERROR: compile main.cpp on localhost failed
make: *** [main] Error 1

(2) с другой стороны работает.

Что мне нужно исправить, чтобы заставить (1) работать вообще?

Ответы [ 3 ]

6 голосов
/ 20 января 2011

Напишите using A::f внутри определения C.

Вы являетесь жертвой сокрытия имени!void C::f(int, int) скрывает void A::f(int), просто потому что.

5 голосов
/ 20 января 2011

В правилах поиска имен C ++ это так, что если имя переопределено в одной области, все перегрузки этого имени скрыты.

Но вы можете использовать using, чтобы помочь. Как это:

class A {
    public:
    int f(int x) { cout << "A::f 1\n"; }
    int f(int x, int y) { cout << "A::f 2\n"; }
};

class B : public A {
    public:
    using A::f;
    int f(int x) { cout << "B::f 1\n"; }
};

int main()
{
    B b;

    b.f(27, 34);

    return 0;
}

Вывод:

A::f 2
3 голосов
/ 20 января 2011

Короткий ответ на вопрос «почему» - «потому что так работает перегрузка». Вы скрываете перегрузку f(int) в C. Чем длиннее ответ, тем длиннее.

Вы можете скрыть это, сделав это:

struct C: public B {
  using A::f;
  void f(int, int) { }
  void f1(int) { }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...