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

时间:2011-06-16 06:39:17

标签: c++ override static-methods language-lawyer

struct B {
  void foo () {}
};

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

int main ()
{
  D obj;
  obj.foo();  // calls D::foo() !?
}

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

  1. static方法不会覆盖 基础class
  2. 中的虚拟函数
  3. 两者的函数指针签名 案件不同
  4. 当一个对象调用一个方法时,成员方法逻辑上不应该有更高的偏好吗? (只是C ++允许使用object would it be considered as an overridden方法调用static方法?)

2 个答案:

答案 0 :(得分:9)

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

  

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

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

答案 1 :(得分:1)

这里的问题是你不能使用具有相同签名的非静态方法重载静态方法。

现在,如果你尝试:

struct D {
  void foo () {}
  static void foo () {}
};

会触发错误。

我不确定为什么using B::foo在没有触发错误/警告的情况下实际上被忽略(至少在GCC 4.5.1上)。