Наследование С++ перегружает функции с разными параметрами [дубликаты]

Я работаю над проектом, который использует наследование классов и требует множества перегрузок как в базовом, так и в производном классе, я упростил код, но я не хотел бы без необходимости копировать и вставлять, так как это должно быть то, для чего наследование.

#include <iostream>

class Base
{
public:
    Base() = default;

    //base const char* overload
    void foo(const char* message)
    {
        std::cout << message << std::endl;
    }
    //other overloads ...
};
class Derived : public Base
{
public:
    Derived() = default;

    //derived int overload
    void foo(int number)
    {
        std::cout << number << std::endl;
    }
};

int main()
{
    Derived b;
    b.foo(10); //derived overload works
    b.foo("hi"); //causes error, acts as if not being inherited from Base class
    return 0;
}

person MaximV    schedule 11.04.2020    source источник
comment
Добавьте using Base::foo; в тело Derived. В противном случае видны только Derived::foo перегрузки. Проблема не в разрешении перегрузки, а в поиске имени.   -  person Igor Tandetnik    schedule 12.04.2020
comment
Общий вопрос - не самая четкая перегонка Q или A, а, например: почему версия этого вопроса: stackoverflow.com/q/1628768/410767   -  person Tony Delroy    schedule 12.04.2020


Ответы (1)


Вы можете использовать объявление using в производном классе, например

using Base::foo;

сделать видимыми в производном классе перегруженные функции foo, объявленные в базовом классе.

Вот ваша программа, в которую вставлено объявление using.

#include <iostream>

class Base
{
public:
    Base() = default;

    //base const char* overload
    void foo(const char* message)
    {
        std::cout << message << std::endl;
    }
    //other overloads ...
};
class Derived : public Base
{
public:
    Derived() = default;

    using Base::foo;
    //derived int overload
    void foo(int number)
    {
        std::cout << number << std::endl;
    }
};

int main()
{
    Derived b;
    b.foo(10); //derived overload works
    b.foo("hi"); //causes error, acts as if not being inherited from Base class
    return 0;
}

Вывод программы

10
hi
person Vlad from Moscow    schedule 11.04.2020