Перегрузка метода в подклассе в 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);
};