Overriding métodos virtuales de C ++ con múltiples firmas [duplicado]
Esta pregunta ya tiene una respuesta aquí:
¿Por qué una función anulada en la clase derivada oculta otras sobrecargas de la clase base? 4 respuestasTengo una clase base de C ++ que declara un método virtual con dos firmas diferentes.
n cuanto anulo una de las firmas de métodos virtuales en una clase derivada, el compilador (g ++ 4.6.3 y g ++ 4.7) ya no puede hacer coincidir el método con la segunda firma en la misma clase derivada.
El código de ejemplo a continuación no se compilará si solo defino SPECIALIZE_ONEARG a 1. Para que vuelva a compilarse también tengo que definir PASSTHRU_TWOARG a 1. El uso del método "PASSTHRU" no es ideal debido a la eficiencia y porque lo real la jerarquía de clases es mucho más profunda y preferiría no conectar en la llamada a la clase base.
Este comportamiento es específico de g ++ o solo estoy tratando de hacer algo que no es compatible con 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 );
}