C++ 为什么静态方法覆盖基类非静态方法?
成员方法和静态成员方法完全不同,原因有二:C++ 为什么静态方法覆盖基类非静态方法?,c++,overriding,static-methods,language-lawyer,C++,Overriding,Static Methods,Language Lawyer,成员方法和静态成员方法完全不同,原因有二: static方法不会覆盖 基本类中的虚拟函数 两者的函数指针签名 情况不同 当一个方法被一个对象调用时,成员方法在逻辑上不应该有更高的优先级吗?(C++允许使用方法> 静态/方法> 。这里的问题是,不能使用具有相同签名的非静态方法重载静态方法。 现在,如果您尝试: struct B { void foo () {} }; struct D : B { using B::foo; static void foo () {} }; int
static
方法不会覆盖
基本类中的虚拟函数
当一个方法被一个对象调用时,成员方法在逻辑上不应该有更高的优先级吗?(C++允许使用<对象>方法> <代码>静态/<代码>方法> 。这里的问题是,不能使用具有相同签名的非静态方法重载静态方法。 现在,如果您尝试:
struct B {
void foo () {}
};
struct D : B {
using B::foo;
static void foo () {}
};
int main ()
{
D obj;
obj.foo(); // calls D::foo() !?
}
它将触发一个错误
我真的不知道为什么在
使用B::foo的情况下,它实际上会被默默地忽略,而不会触发错误/警告(至少在GCC 4.5.1中是这样的)。您看到的规则在ISO/IEC 14882:2003 7.3.3[namespace.udecl]/12中有描述:
当using声明将名称从基类带入派生类作用域时,派生类中的成员函数将重写和/或隐藏基类中具有相同名称和参数类型(而不是冲突)的成员函数
如果没有此规则,函数调用将是不明确的。它是否也适用于静态
成员?如果是,那么为什么static
方法与virtual
方法冲突?@iammilind,因为这只适用于using声明。@iammilind:virtual
和static
在这一点上没有任何区别,因为决定在您的应用程序上调用哪个函数只是重载解析D
object。这是最不明显的一点:在进行非静态解析时,根本不需要考虑静态方法,但这只是工作方式。@Eamon:这都是“脆弱”基类的问题。这个问题源于这样一个事实,即静态方法可以通过dot
从调用。从这一点开始,隐藏是必须的,否则在基类中引入foo
可能会破坏所有客户端代码。
struct D {
void foo () {}
static void foo () {}
};