2

2 つの異なる署名を持つ仮想メソッドを宣言する C++ 基本クラスがあります。

派生クラスの仮想メソッド シグネチャの 1 つをオーバーライドするとすぐに、コンパイラ (g++ 4.6.3 および g++ 4.7) は、メソッドを同じ派生クラスの 2 番目のシグネチャと一致させることができなくなります。

以下のサンプル コードは、SPECIALIZE_ONEARG を 1 に定義しただけではコンパイルされません。もう一度コンパイルするには、PASSTHRU_TWOARG も 1 に定義する必要があります。階層ははるかに深く、基本クラスへの呼び出しにハードワイヤードしないことをお勧めします。

この動作は g++ に固有のものですか、それとも C++ でサポートされていないことをしようとしているだけですか?

#define SPECIALIZE_ONEARG ( 0 )
#define PASSTHRU_TWOARG   ( 0 )

class base
{
public:
  virtual int myMethod( char a )         { return 1; }
  virtual int myMethod( char a, int b )  { return 2; }
};

class derived : public base
{
public:
#if SPECIALIZE_ONEARG
  virtual int myMethod( char a )         { return 3; }
#endif // SPECIALIZE_ONEARG

#if PASSTHRU_TWOARG
  virtual int myMethod( char a, int b )  { return base::myMethod( a, b ); }
#endif // PASSTHRU_TWOARG
};

int main( int argc, char* argv[])
{
  derived myObj;

  return myObj.myMethod( 'a' ) * 10 + myObj.myMethod( 'b', 0 );
}
4

2 に答える 2

7

あなたの定義は、基本クラスから定義を隠しています。その定義を派生スコープで表示するには、 が必要using base::myMethodです。

class derived : public base
{
public:
  using base::myMethod; // <--- here

#if SPECIALIZE_ONEARG
  virtual int myMethod( char a )         { return 3; }
#endif // SPECIALIZE_ONEARG

#if PASSTHRU_TWOARG
  virtual int myMethod( char a, int b )  { return base::myMethod( a, b ); }
#endif // PASSTHRU_TWOARG
};
于 2012-05-29T20:27:22.600 に答える
2

派生クラスで、追加

using base::myMethod;
于 2012-05-29T20:27:06.360 に答える