2 votes

Remplacer les méthodes virtuelles C++ par des signatures multiples

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

7voto

K-ballo Points 44794

Votre définition est cacher la définition de la classe de base. Pour que cette définition soit visible dans votre portée dérivée, vous devez using base::myMethod .

class derived : public base
{
public:
  using base::myMethod; // <--- here

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

2voto

NPE Points 169956

Dans la classe dérivée, ajoutez

using base::myMethod;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X