如果子级重写另一个具有相同名称和不同签名的方法,则不继承基类方法

kMa*_*ter 0 c++ inheritance c++11

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

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);
}
Run Code Online (Sandbox Code Playgroud)

基本上,我想foo在类A(以及任何子类)中使用该方法的两个版本。一个没有参数的参数必须由孩子定义(因此将其声明为pure)。但是,每个孩子都不需要重新定义一个带有整数的整数(因为功能相同:调用无参数版本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
Run Code Online (Sandbox Code Playgroud)

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

lub*_*bgr 5

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

using A::foo;
Run Code Online (Sandbox Code Playgroud)