Компилятор не может найти метод базового класса при вызове из производного, а производный определяет метод с тем же именем и дополнительным параметром

Вот ссылка на ideone с простой вставкой кода: http://ideone.com/BBcK3B .

Базовый класс имеет беспараллельную функцию, тогда как производный имеет функцию с параметром. Все публично.

Почему компилятору не удается найти A :: foo () при вызове из экземпляра B?

Код:

#include <iostream>
using namespace std;

class A
{
public:
virtual void foo()
{
cout << "A::foo" << endl;
}
};

class B : public A
{
public:
void foo(int param)
{
cout << "B::foo " << param << endl;
}
};

int main()
{
B b;
b.foo();
}

Ошибка компилятора:

prog.cpp: In function ‘int main()’:
prog.cpp:25:11: error: no matching function for call to ‘B::foo()’
b.foo();
^
prog.cpp:25:11: note: candidate is:
prog.cpp:16:10: note: void B::foo(int)
void foo(int param)
^
prog.cpp:16:10: note:   candidate expects 1 argument, 0 provided

5

Решение

Это стандартное поведение C ++: метод базового класса скрыт методом одноименного производного класса, независимо от аргументов и квалификаторов. Если вы хотите избежать этого, вы должны явно сделать доступным метод (ы) базового класса:

class B : public A
{
public:
void foo(int param)  // hides A::foo()
{
cout << "B::foo " << param << endl;
}
using A::foo;        // make A::foo() visible again
};
8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]