11
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方法不会覆盖 base 中的虚函数class
  2. 两种情况的函数指针签名不同

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

4

2 回答 2

9

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

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

如果没有这个规则,函数调用将是模棱两可的。

于 2011-06-16T06:56:50.337 回答
1

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

现在,如果您尝试:

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

它会触发错误。

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

于 2011-06-16T06:49:46.080 回答