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;
}
Поиск имени происходит до разрешения перегрузки, поэтому, как только 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);
};