如果重载函数仅被部分重写,则多态性不起作用



今天我感觉自己像个傻瓜:

class Base
{
public:
    virtual void foo(int)=0;
    virtual void foo(int, int) {}
    virtual void bar() {}
};
class Derived : public Base
{
public:
    virtual void foo(int) {}
};
void main()
{
    Derived d;
    d.bar(); // works
    d.foo(1); // works
    d.foo(1,2); // compiler error: no matching function call
}

我希望dBase继承foo(int, int),但事实并非如此。那么我在这里错过了什么?

这是因为具有相同名称的基函数是隐藏的。

您需要将using用于未覆盖的功能:

class Derived : public Base
{
public:
    using Base::foo;
    virtual void foo(int) {}  //this hides all base methods called foo
};

它被称为Name hiding。您可以通过提供Derived::foo(int) 来隐藏Base::foo(int, int)

最新更新