operator()的继承

时间:2011-12-29 16:43:58

标签: c++ inheritance operator-overloading

我很难理解为什么在派生类实现void operator()(int)时,下面代码示例中基类中的void operator()(int,int,int)声明似乎是隐藏的。如何从基类foo获取operator()(int)的声明,以便在派生类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)'...候选者是空bar :: operator()(int,int, int)...候选人需要3个参数,1提供。“

2 个答案:

答案 0 :(得分:6)

没错。派生类函数隐藏基类函数而不是重载。修复非常简单:

struct bar : foo
{
     using foo::operator();
     void operator()(int, int, int) {}
};

答案 1 :(得分:2)

请注意,operator()可能会让它看起来比它更混乱。经典的例子可能更像是bar :: mymethod(int)和foo :: mymethod()。由于分辨率如何发生,派生方法隐藏了继承的方法。另一个答案中解释的使用声明引入了foo的解决方法。