J'ai une classe de base C++ qui déclare une méthode virtuelle avec deux signatures différentes.
Dès que je surcharge une des signatures de méthode virtuelle dans une classe dérivée, le compilateur (g++ 4.6.3 et g++ 4.7) n'est plus capable de faire correspondre la méthode avec la deuxième signature dans la même classe dérivée.
L'exemple de code ci-dessous ne compile pas si je définis seulement SPECIALIZE_ONEARG à 1. Pour qu'il compile à nouveau, je dois aussi définir PASSTHRU_TWOARG à 1. L'utilisation de la méthode "PASSTHRU" n'est pas idéale pour des raisons d'efficacité et parce que la hiérarchie réelle des classes est beaucoup plus profonde et que je préférerais ne pas intégrer l'appel à la classe de base.
Ce comportement est-il spécifique à g++ ou est-ce que j'essaie simplement de faire quelque chose qui n'est pas supporté par 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 );
}