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