11
struct B {
  void foo () {}
};

struct D : B {
  using B::foo;
  static void foo () {}
};

int main ()
{
  D obj;
  obj.foo();  // calls D::foo() !?
}

メンバー メソッドとstaticメンバー メソッドは、次の 2 つの理由でまったく異なります。

  1. staticメソッドはベースの仮想関数をオーバーライドしません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 に答える