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 () {}
    };