struct B {
void foo () {}
};
struct D : B {
using B::foo;
static void foo () {}
};
int main ()
{
D obj;
obj.foo(); // calls D::foo() !?
}
会员方法和 static
成员方法完全不同有两个原因:
static
方法不会覆盖
基础中的虚函数 class
- 两者的函数指针签名
案件不同
当一个方法被一个对象调用时,成员方法逻辑上不应该有更高的偏好吗? (只是C ++允许 static
使用object调用的方法, 它会被视为被覆盖的吗? 方法 ?)
您所看到的规则在ISO / IEC 14882:2003 7.3.3 [namespace.udecl] / 12中有所描述:
当一个 使用声明 将基类中的名称带入派生类范围,派生类中的成员函数覆盖和/或隐藏基类中具有相同名称和参数类型的成员函数(而不是冲突)。
没有这个规则,函数调用将是模糊的。
您所看到的规则在ISO / IEC 14882:2003 7.3.3 [namespace.udecl] / 12中有所描述:
当一个 使用声明 将基类中的名称带入派生类范围,派生类中的成员函数覆盖和/或隐藏基类中具有相同名称和参数类型的成员函数(而不是冲突)。
没有这个规则,函数调用将是模糊的。
这里的问题是您不能使用具有相同签名的非静态方法重载静态方法。
现在,如果你尝试:
struct D {
void foo () {}
static void foo () {}
};
它会触发错误。
我不确定为什么会这样 using B::foo
实际上它被忽略而没有触发错误/警告(至少在GCC 4.5.1上)。