没有匹配函数用于调用...继承的C ++类中缺少重载

时间:2013-08-15 13:21:16

标签: c++ inheritance overloading

有人可以解释一下这里发生了什么。为什么编译器看不到类A中没有参数的hello()?

struct A {
    virtual void hello() {}
    virtual void hello(int arg) {}
};
struct B : A {
    virtual void hello(int arg) {}
};

int main()
{
    B* b = new B();
    b->hello();
    return 0;
}

g ++ main.cpp

main.cpp: In function ‘int main()’:
main.cpp:13:11: error: no matching function for call to ‘B::hello()’
main.cpp:13:11: note: candidate is:
main.cpp:7:15: note: virtual void B::hello(int)
main.cpp:7:15: note:   candidate expects 1 argument, 0 provided

3 个答案:

答案 0 :(得分:7)

因为覆盖hello(int arg)会隐藏其他具有相同名称的功能。

您可以做的是将这些基类函数显式引入子类:

struct B : A {
    using A::hello; // Make other overloaded version of hello() to show up in subclass.
    virtual void hello(int arg) {}
};

答案 1 :(得分:3)

在派生类中声明一个名为hello的函数,隐藏基类中具有相同名称的所有函数。您可以使用声明取消隐藏它们:

struct B : A {
    using A::hello;
    virtual void hello(int arg) {}
};

或通过基类指针或引用访问它们:

static_cast<A*>(b)->hello();

答案 2 :(得分:0)

hello(int)中的B成员函数采用int参数并隐藏hello() A成员。如果您希望hello的{​​{1}}成员函数不隐藏B中的{}},请将A添加到using A::hello