[英]Does a virtual function override a non-virtual function of the same name in a base class?
[英]Non-virtual function in the base class with same name but different signature not found
struct A
{
void foo() { cout << "a:foo(void)" << endl; }
virtual void foo(int) = 0;
};
struct B : public A
{
virtual void foo(int) override { cout << "b:foo(int)" << endl; }
};
int main()
{
B x;
x.foo();
}
所以,这是代码示例。 在主要方面,我希望为x.foo()
调用非虚拟foo()
x.foo()
,但事实并非如此,编译器给出以下错误:
x.cpp: In function ‘int main()’:
x.cpp:20:11: error: no matching function for call to ‘B::foo()’
20 | x.foo();
| ^
x.cpp:12:18: note: candidate: ‘virtual void B::foo(int)’
12 | virtual void foo(int x) override { cout << "b:foo(int)" << endl; }
| ^~~
x.cpp:12:18: note: candidate expects 1 argument, 0 provided
似乎编译器无法从 A 中找到 foo() 函数。向A::void foo(void)
函数添加virtual
没有帮助(相同的错误)。 谁能解释发生了什么,为什么这不起作用?
在派生类中定义函数时,与基类中该函数同名的重载集将隐藏在派生类中。 所以编译器只发现派生类中带有int
的foo
,导致错误。
如果要将基类中的foo
重载集引入派生类,可以使用如下所示的using
声明:
struct B : public A
{
using A::foo;
// ...
};
这是一个演示。
代替 :
x.foo();
和 :
x.A::foo();
它会起作用。 发生这种情况是因为您通过将方法中的一个设为 virtual 和另一个非 virtual 混淆了编译器,您需要将它们设为两个虚拟或更改第二个方法的名称
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.