【发布时间】: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