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东西,则一切正常。
这是名称查找的工作方式。当类似的派生类B具有其自己的成员函数时foo,它将隐藏foo其基类的所有成员函数(与virtual-ness和function参数正交),即,它隐藏重载集合。但是,您可以将它们显式引入。在public:class 的部分中B,添加:
using A::foo;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47 次 |
| 最近记录: |