繁体   English   中英

基类中未找到同名但签名不同的非虚函数

[英]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没有帮助(相同的错误)。 谁能解释发生了什么,为什么这不起作用?

在派生类中定义函数时,与基类中该函数同名的重载集将隐藏在派生类中。 所以编译器只发现派生类中带有intfoo ,导致错误。

如果要将基类中的foo重载集引入派生类,可以使用如下所示的using声明:

struct B : public A
{
    using A::foo;
    // ...
};

这是一个演示

代替 :

x.foo();

和 :

x.A::foo();

它会起作用。 发生这种情况是因为您通过将方法中的一个设为 virtual 和另一个非 virtual 混淆了编译器,您需要将它们设为两个虚拟或更改第二个方法的名称

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM