Наследование оператора () - PullRequest
5 голосов
/ 29 декабря 2011

Я озадачен тем, почему объявление void operator()(int) в базовом классе в приведенном ниже примере кода, по-видимому, скрыто, когда производный класс реализует void operator()(int,int,int).Как я могу получить объявление operator () (int) из базового класса foo, которое будет видно в производном классе bar?То есть, как я могу изменить пример так, чтобы он вызывал оператор operator () (int)?

#include <iostream>

struct foo
{
        void operator()(int)
        {
                std::cout << "A" << std::endl;
        }
};

struct bar : foo
{
        // If this is uncommented, the code will not compile.
        // void operator()(int, int, int) {}
};

int main()
{
        bar b;
        b(1);
        return 0;
}

При компиляции с g ++ с отмеченными строками без комментариев сообщение об ошибке будет иметь виднет совпадения для вызова 'bar (int)' ... кандидат - void bar :: operator () (int, int, int) ... кандидат ожидает 3 аргумента, 1 предоставлено. "

Ответы [ 2 ]

6 голосов
/ 29 декабря 2011

Это верно. Производные функции класса скрывают функции базового класса, а не перегружают. Это довольно простое исправление:

struct bar : foo
{
     using foo::operator();
     void operator()(int, int, int) {}
};
2 голосов
/ 29 декабря 2011

Обратите внимание, что operator () может сделать это более запутанным, чем на самом деле.Классическим примером может быть что-то более похожее на bar :: mymethod (int) и foo :: mymethod ().Производный метод скрывает унаследованный метод из-за того, как происходит разрешение.Объявление использования, объясненное в другом ответе, вводит метод foo для разрешения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...