为什么静态方法会覆盖基类非静态方法?

iam*_*ind 11 c++ static-methods overriding language-lawyer

struct B {
  void foo () {}
};

struct D : B {
  using B::foo;
  static void foo () {}
};

int main ()
{
  D obj;
  obj.foo();  // calls D::foo() !?
}
Run Code Online (Sandbox Code Playgroud)

成员方法和static成员方法完全不同有两个原因:

  1. static 方法不会覆盖base中的虚函数 class
  2. 两种情况的函数指针签名都不同

当一个方法被一个对象调用时,成员方法逻辑上不应该有更高的偏好吗?(只是C++允许static使用对象调用方法,它会被视为重写方法吗?)

CB *_*ley 9

您所看到的规则在ISO/IEC 14882:2003 7.3.3 [namespace.udecl]/12中描述:

using声明将基类中的名称带入派生类范围时,派生类中的成员函数会覆盖和/或隐藏基类中具有相同名称和参数类型的成员函数(而不是冲突).

如果没有这个规则,函数调用将是不明确的.

  • @iammilind:`virtual`和`static`在这一点上没有任何区别,因为它只是重载决议决定了你的`D`对象应该调用哪个函数. (2认同)
  • @Eamon:这都是"脆弱"基类的问题.问题源于可以使用`dot`调用静态方法.从这一点开始,**隐藏**是强制性的,否则*在基类中引入*`foo`可能会破坏**所有**客户端代码. (2认同)