Перегрузка метода в подклассе в C++
Предположим, у меня есть такой код:
class Base {
public:
virtual int Foo(int) = 0;
};
class Derived : public Base {
public:
int Foo(int);
virtual double Foo(double) = 0;
};
class Concrete : public Derived {
public:
double Foo(double);
};
Если у меня есть объект типа Concrete, почему я не могу вызвать Foo(int)?
Если я изменю имя Foo (double) так, чтобы оно не перегружало Foo, тогда все хорошо, и оба метода доступны, но это не то, что я хочу.
Аналогично, если я удаляю конкретный класс и реализую Foo(double) в производном, то оба доступны, но опять же, не то, что я хочу.
2 ответов
поиск имени происходит до разрешения перегрузки, поэтому один раз Foo
был найден в Concrete
, базовые классы не будут искать другие методы, называемые Foo
. int Foo(int)
на Derived
скрытый Foo
на Concrete
.
у вас есть несколько вариантов.
измените вызов на явный.
concrete.Derived::Foo(an_int);
добавьте объявление using в бетон.
class Concrete : public Derived {
public:
using Derived::Foo;
double Foo(double);
};
вызовите функцию через базовую ссылку.
Derived& dref = concrete;
dref.Foo(an_int);
Foo(double)
скрывает функцию от вашей базы. Вы можете сделать его видимым, хотя:
class Concrete : public Derived
{
public:
using Derived::Foo;
double Foo(double);
};