Surcharge d'une méthode appartenent à un patron de classe

Surcharge d'une méthode appartenent à un patron de classe - C++ - Programmation

Marsh Posté le 23-11-2006 à 12:25:11    

Bonjour à tous.
Voici mon soucis.
J' ai une classe mère ou j'utilise un patron de class.  
(Fichier a.h)
template <typename T> class a
{
  public:
     virtual T * methode() = 0;
};

 
Je dérive ma classe.
(fichier b.h)
class b : public a<int>
{
  public:
     int * methode();
}

 
Le problème lorsque je veux créer une instance de b, j'ai une erreur de compilation me signalant que ce n'est pas possible car b est abstraite. Don j'en déduis que b ne surcharge pas la méthode virtuel de a. Ma question est pourquoi? et comment faire ?
 
Merci d'avance pour vos réponse.
 
Cordialement, Novsirion
 

Reply

Marsh Posté le 23-11-2006 à 12:25:11   

Reply

Marsh Posté le 23-11-2006 à 13:37:48    

Novsirion a écrit :

Bonjour à tous.
Voici mon soucis.
J' ai une classe mère ou j'utilise un patron de class.  
(Fichier a.h)
template <typename T> class a
{
  public:
     virtual T * methode() = 0;
};

 
Je dérive ma classe.
(fichier b.h)
class b : public a<int>
{
  public:
     int * methode();
}

 
Le problème lorsque je veux créer une instance de b, j'ai une erreur de compilation me signalant que ce n'est pas possible car b est abstraite. Don j'en déduis que b ne surcharge pas la méthode virtuel de a. Ma question est pourquoi? et comment faire ?
 
Merci d'avance pour vos réponse.
 
Cordialement, Novsirion


 
Le probleme vient du fait que pour des raisons que je n'exposerai pas ici, il n'est possible d'instacier des fonctions qui soit a la fois virtuelle et template. Il faut donc que tu revois ton architecture si c'est le cas.

Reply

Marsh Posté le 23-11-2006 à 13:59:00    

papangue a écrit :

Le probleme vient du fait que pour des raisons que je n'exposerai pas ici, il n'est possible d'instacier des fonctions qui soit a la fois virtuelle et template. Il faut donc que tu revois ton architecture si c'est le cas.


Ce n'est pas le cas ici, puisqu'il s'agit d'une fonction membre (non template) d'une classe template, et non pas d'une fonction membre template d'une classe (template ou non), ce qui qui serait efectivement interdit.


---------------
TriScale innov
Reply

Marsh Posté le 23-11-2006 à 14:17:10    

Chez moi, ça marche bien :

Code :
  1. #include <iostream>
  2. template <typename T>
  3. class Base
  4. {
  5. public:
  6.   virtual T method() = 0;
  7. };
  8. class Derived : public Base<int>
  9. {
  10. public:
  11.   int method(){ return 1; };
  12. };
  13. int main()
  14. {
  15.   Derived d;
  16.   std::cout << d.method() << std::endl;
  17. }


pas de warning ni d'erreur à ce sujet à la compilation ; l'exécution fait ce qu'on attend :

~/tmp/hfr> g++ --version
g++ (GCC) 4.0.1 (4.0.1-5mdk for Mandriva Linux release 2006.0)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
~/tmp/hfr> g++ -Wall -pedantic essai.cpp
essai.cpp: In instantiation of 'Base<int>':
essai.cpp:10:   instantiated from here
essai.cpp:5: warning: 'class Base<int>' has virtual functions but non-virtual destructor
essai.cpp:11: warning: 'class Derived' has virtual functions but non-virtual destructor
 
~/tmp/hfr> ./a.out
1


 
Je sais pas ce qui va pas chez toi...


---------------
TriScale innov
Reply

Marsh Posté le 23-11-2006 à 14:48:53    

Merci pour ton aide francesco j'ai trouvé mon erreur. C'était un truc tout bête en fait. Mais ne sachant pas ce point là j'ai préféré consulter votre avis. Tiens en parlant de template j'ai une question pour la STL :
 
#include <iostream>
#include <list>
 
using namespace std;
 
template <typename T> class Base
{
  public:
    list<T> m_list;
    list<T>::iterator m_ite;
};
 
int main( int argc, char ** argv )
{
   Base<int> d;
   return 0;
}
 
je compile et j'obtiens une erreur expected ; before m_ite


Message édité par Novsirion le 23-11-2006 à 14:51:23
Reply

Marsh Posté le 23-11-2006 à 15:14:49    

il faut mettre le mot-clé typename devant list<T>::iterator.
 
De manière générale, lorsque tu as un nom de type pleinement qualifié (i.e. de la forme toto::type) servant à déclarer un membre dans une classe template, il faut que tu spécifies qu'il s'agit d'un type, en utilisant le mot-clé typename (attention, ce n'est pas la même sémantique que le typename que tu mets dans la déclaration du template)


---------------
TriScale innov
Reply

Marsh Posté le 23-11-2006 à 18:49:11    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed