首先,我对这个问题的标题含糊不清表示歉意。考虑以下示例:
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;