Überschreiben virtueller C ++ - Methoden mit mehreren Signaturen [duplizieren]

Diese Frage hat hier bereits eine Antwort:

Warum verbirgt eine überschriebene Funktion in der abgeleiteten Klasse andere Überladungen der Basisklasse? 4 Antworten

Ich habe eine C ++ - Basisklasse, die eine virtuelle Methode mit zwei verschiedenen Signaturen deklariert.

Sobald ich eine der virtuellen Methodensignaturen in einer abgeleiteten Klasse überschreibe, kann der Compiler (g ++ 4.6.3 und g ++ 4.7) die Methode nicht mehr mit der zweiten Signatur in derselben abgeleiteten Klasse abgleichen.

Der folgende Beispielcode wird nicht kompiliert, wenn ich SPECIALIZE_ONEARG nur auf 1 definiere. Um ihn erneut zu kompilieren, muss auch PASSTHRU_TWOARG auf 1 definiert werden. Die Verwendung der "PASSTHRU" -Methode ist aus Effizienzgründen und wegen des Real nicht ideal Die Klassenhierarchie ist viel tiefer und ich würde es vorziehen, den Aufruf der Basisklasse nicht fest zu verkabeln.

Ist dieses Verhalten spezifisch für g ++ oder versuche ich nur, etwas zu tun, das in C ++ nicht unterstützt wird?

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