我们有代码:
struct B
{
virtual void f() {}
};
struct D : B
{
void f(int) { }
};
int main() { }
clang对其发出警告:
'D::f' hides overloaded virtual function [-Woverloaded-virtual]
现在我们f(int)在类中将其设为静态D:
struct B
{
virtual void f() {}
};
struct D : B
{
static void f(int) { }
};
int main() { }
代码编译时没有警告。但是,尝试f()在类对象上使用D:
int main()
{
D d;
d.f();
}
导致错误:
too few arguments to function call, expected 1, have 0
那些。static f(int)仍然隐藏功能B。通过添加using B::f;类解决了问题D,代码编译成功。但是问题来了:
B::f()隐藏静态函数时是否有任何客观原因不发出警告D::f(int)?
据我了解,需要此警告以防止在需要重新定义虚拟功能时出现与隐藏虚拟功能相关的错误。例如,有一个错字:
关键字
override可以解决这个问题,但只要它是可选的,这个诊断就会定期生效和触发。至于
static. 我认为编译器开发人员推断,由于虚函数不能是静态的,那么程序员很可能不打算重新定义任何东西。因此,没有错误。