Перегрузка метода в подклассе в C ++ - PullRequest
9 голосов
/ 14 ноября 2009

Предположим, у меня есть такой код:

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, тогда все в порядке, и оба метода доступны, но это не то, что я хочу. Точно так же, если я удалю класс Concrete и реализую Foo (double) в Derived, тогда оба будут доступны, но опять же, не то, что я хочу.

Ответы [ 2 ]

17 голосов
/ 14 ноября 2009

Поиск имени происходит до разрешения перегрузки, поэтому, как только Foo найден в Concrete, базовые классы не будут искать другие методы, называемые Foo. int Foo(int) в Derived скрыто Foo в Concrete.

У вас есть несколько вариантов.

Изменить вызов на явный.

concrete.Derived::Foo(an_int);

Добавление объявления об использовании в Concrete.

class Concrete : public Derived {
public:          
   using Derived::Foo;
   double Foo(double);
};

Вызовите функцию через базовую ссылку.

Derived& dref = concrete;
dref.Foo(an_int);
6 голосов
/ 14 ноября 2009

Foo(double) скрывает функцию от вашей базы. Вы можете сделать это видимым, хотя:

class Concrete : public Derived 
{
public:          
  using Derived::Foo;
  double Foo(double);
};
...