Перегрузка метода в подклассе в C++

Java 1.6: рекурсивный, запоминаемый (для последующих вызовов)

private static Map<BigInteger, BigInteger> _results = new HashMap()

public static BigInteger factorial(BigInteger n){
    if (0 >= n.compareTo(BigInteger.ONE))
       return BigInteger.ONE.max(n);
    if (_results.containsKey(n))
       return _results.get(n);
    BigInteger result = factorial(n.subtract(BigInteger.ONE)).multiply(n);
    _results.put(n, result);
    return result;
}
10
задан James 14 November 2009 в 17:13
поделиться

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);
17
ответ дан 3 December 2019 в 17:20
поделиться

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

class Concrete : public Derived 
{
public:          
  using Derived::Foo;
  double Foo(double);
};
6
ответ дан 3 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: