从父级访问重载方法 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::
的原因
我偶然发现了这段代码,我无法理解,为什么我需要指定 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::