Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2817 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1480559
Novsirion
Posté le 23-11-2006 à 12:25:11  profilanswer
 

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
 

mood
Publicité
Posté le 23-11-2006 à 12:25:11  profilanswer
 

n°1480602
papangue
Posté le 23-11-2006 à 13:37:48  profilanswer
 

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.

n°1480636
franceso
Posté le 23-11-2006 à 13:59:00  profilanswer
 

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
n°1480659
franceso
Posté le 23-11-2006 à 14:17:10  profilanswer
 

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
n°1480686
Novsirion
Posté le 23-11-2006 à 14:48:53  profilanswer
 

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
n°1480717
franceso
Posté le 23-11-2006 à 15:14:49  profilanswer
 

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
n°1480959
Taz
bisounours-codeur
Posté le 23-11-2006 à 18:49:11  profilanswer
 

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
surcharge opérateur [ ][Struts]accés aux ressources depuis une classe action
Comment déclarer un pointer sur classe template ?[Resolu] Redefinir une classe css à l'aide de PHP?
Surcharge =Surcharge d'opérateur
Classe abstraite implémentant une interfaceEnvoi par méthode _Post quand on appuie sur un lien?
[C] Méthode replace de la classe string 
Plus de sujets relatifs à : Surcharge d'une méthode appartenent à un patron de classe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR