Przesłanianie metod wirtualnych C ++ z wieloma podpisami [duplikat]

To pytanie ma już odpowiedź tutaj:

Dlaczego przesłonięta funkcja w klasie pochodnej ukrywa inne przeciążenia klasy podstawowej? 4 odpowiedzi

Mam klasę bazową C ++, która deklaruje metodę wirtualną z dwoma różnymi podpisami.

Gdy tylko przesłonię jedną z sygnatur metody wirtualnej w klasie pochodnej, kompilator (g ++ 4.6.3 i g ++ 4.7) nie jest już w stanie dopasować metody do drugiej sygnatury w tej samej klasie pochodnej.

Poniższy przykładowy kod nie zostanie skompilowany, jeśli zdefiniuję SPECIALIZE_ONEARG na 1. Aby ponownie go skompilować, muszę również zdefiniować PASSTHRU_TWOARG na 1. Korzystanie z metody „PASSTHRU” nie jest idealne ze względu na wydajność i ponieważ rzeczywiste hierarchia klas jest znacznie głębsza i wolałbym nie tworzyć połączeń w wywołaniu klasy podstawowej.

Czy to zachowanie jest specyficzne dla g ++, czy tylko próbuję zrobić coś, co nie jest obsługiwane w 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 );
}

questionAnswers(2)

yourAnswerToTheQuestion