6

有人可以解释一下这里发生了什么。为什么编译器在 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
4

3 回答 3

8

因为您的覆盖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) {}
};
于 2013-08-15T13:24:17.047 回答
3

声明hello在派生类中调用的函数会隐藏基类中的所有同名函数。您可以使用 using 声明取消隐藏它们:

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

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

static_cast<A*>(b)->hello();
于 2013-08-15T13:24:39.677 回答
0

in的hello(int)成员函数B接受一个 int 参数并隐藏 的hello()成员A。如果你想不隐藏的hello成员函数,添加到。BAusing A::helloB

于 2013-08-15T13:23:37.433 回答