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 ++允许使用object would it be considered as an overridden方法调用static
方法?)
答案 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上)。