从父级访问重载方法 class

Accessing overloaded method from a parent class

我偶然发现了这段代码,我无法理解,为什么我需要指定 class 我想用一个参数调用方法?更有趣的是,如果我删除带有两个参数的第二个重载方法,一切都会正常工作。

class A {
public:
    virtual void foo(int a) const final {};
    virtual void foo(int a, int b) const = 0;
};

class B : public A {
public:
    void foo(int a, int b) const override {}
};

int main() {
    B b;
    b.A::foo(1); // Why do I need to specify A::foo??
    // b.foo(1) -- won't compile
}

这是因为当您重写 B 中的 foo 时,来自基础 A 的其他重载 foo 被屏蔽了。这是语言的一个特点。

因为 b 看到的是 foo(int a, int b) 的重载实例,它预制了 name hiding,因此 foo(int a, int b) 使 foo(int a) 对 [=10= 不可见].如果你想制作 foo(int a),你应该指定它应该在 class A 中查找,这就是你需要 A::

的原因