首先,我对这个问题的标题含糊不清表示歉意。考虑以下示例:

class A {
    public:
        virtual void foo() const = 0;
        void foo(int n) const {
            while(n--)
                foo();
        }
};

class B: public A {
    public:
        void foo() const override {
            std::cout << "B::foo()" << std::endl;
        }
};

int main() {
    auto obj = B{};

    obj.foo();

    obj.foo(10);
}


基本上,我想在类foo(以及任何子类)中拥有方法A的两个版本。没有参数的那个必须由孩子定义(因此将其声明为纯)。但是,每个孩子都不需要重新定义带整数的整数(因为功能相同:调用无参数版本n次)。

但是上面的代码无法编译,给出以下错误:

g++ -D_GLIBCXX_DEBUG -std=c++11    example.cpp   -o example
example.cpp: In function ‘int main()’:
example.cpp:31:15: error: no matching function for call to ‘B::foo(int)’
   31 |     obj.foo(10);
      |               ^
example.cpp:21:14: note: candidate: ‘virtual void B::foo() const’
   21 |         void foo() const override {
      |              ^~~
example.cpp:21:14: note:   candidate expects 0 arguments, 1 provided


为什么会这样?我的推理有什么问题?例如,如果我从子级将签名为int foo(int)的方法重命名为类似int foo2(int)' and then call foo2`的方法,则一切正常。

最佳答案

这是名称查找的工作方式。当像B这样的派生类具有自己的成员函数foo时,它将隐藏其基类的所有foo成员函数,这些成员函数与virtual -ness和function参数正交,即,它隐藏了过载集。但是,您可以将它们显式拉入。在public:类的B部分中,添加:

using A::foo;

09-04 13:43
查看更多