【问题标题】:Accessing overloaded method from a parent class从父类访问重载方法
【发布时间】:2021-11-16 00:48:47
【问题描述】:

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

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
}

【问题讨论】:

  • “如果我删除带有两个参数的第二个重载方法”你到底是什么意思?如果删除A::foo,则B 会中断,因为B::foo 被声明为override。与其在代码上描述要修改什么,不如把修改后的代码展示出来
  • 子类中的方法与父类中的方法同名隐藏父类中的所有方法。您可以在 B 类中添加 using A::foo(); 以将它们带回来。
  • 重载仅适用于在同一范围内定义的名称。 B 中只定义了一个 foo,因此使用单个参数调用它是错误的。
  • @463035818_is_not_a_number 我的意思是,如果我从 A 类和 B 类中删除 foo(int, int) ,那么如果我们取消最后一行的注释,代码将被编译

标签: c++ inheritance overloading


【解决方案1】:

因为b 看到的是foo(int a, int b) 的重载实例,它预先形成name hiding,因此foo(int a, int b) 使foo(int a)b 中不可见。如果你想制作foo(int a),你应该指定它应该在class A中查找,这就是你需要A::的原因

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2017-09-22
    • 2017-10-30
    • 2021-06-03
    • 2016-05-22
    相关资源
    最近更新 更多