question sur les fonctions virtuelles

question sur les fonctions virtuelles - C++ - Programmation

Marsh Posté le 05-11-2004 à 19:25:46    

salut,
 
je voudrais savoir si l'on declare une fonction virtuelle dans une classe A, et que l'on a des classes B et C ki heritent de A, doit on obligatoirement declarer cette fonction dans les 2 classes.
exemple:
 

Code :
  1. class A
  2. {
  3. public:
  4.      virtual int toto()=0;
  5. }
  6. class B : public A
  7. {
  8. public:
  9.      int toto(){return 3;}
  10. }
  11. class C : public A
  12. {
  13. public:
  14.      void hehe();
  15. }


 
je pose cette question parceque ceci me prose problem a la compil dans visual:

Code :
  1. c:\src\xml.cpp(253) : error C2259: 'Sbox' : impossible d'instancier une classe abstraite à cause des membres suivants :
  2.         'void Element::RadioChangeStatus(void)' : fonction virtuelle pure non définie


 
si vous avez une solution pour eviter d'avoir a declarer la fonction dans chacune de mes classes ca serait cool.
 
merci de votre aide


Message édité par da_s_monk le 05-11-2004 à 19:26:37
Reply

Marsh Posté le 05-11-2004 à 19:25:46   

Reply

Marsh Posté le 05-11-2004 à 19:29:07    

bin C derive de A et A a une fonction virtuelle pure, donc si tu veux instancier C il faut que C definisse ladite fonction
 
jvois pas le pb ?

Reply

Marsh Posté le 05-11-2004 à 19:37:00    

Ne confond pas fonction virtuelle et virtuelle pure.
 
Une fonction virtuelle pure telle que toto n'est pas définie. Dans ce cas, il faut faire comme chrisbk l'indique.
Une fonction virtuelle simple (pas de = 0) possède une définition, il n'est donc pas nécessaire de la déclarée dans les classes héritées, si tu veux surcharger le comportement.
 
C serait donc valide si tu vires le = 0 et si tu fournis la définition par défaut de toto dans A (mais dans ce cas A n'est plus une interface).


Message édité par Panini le 05-11-2004 à 19:37:15
Reply

Marsh Posté le 05-11-2004 à 19:37:48    

en c++ on ne parle pas d'interface mais de classe abstraite :o

Reply

Marsh Posté le 05-11-2004 à 19:39:20    

Le probleme c ke je voudrai ne pas avoir a definir cette fonction dans des classe ki n'en on pas besoin.
je suis entrain de faire un systeme de fenetre avec des container et des elements style boutton ou textedit. et par exemple pour les radiobutton, g un element RadioContainer ki va contenir des element RadioButton.  
ces deux element sont derivé d'une classe principale ki contient un tableau de pointeur sur les elements du niveau du dessous. voila un bou de xml pour ilustrer:
<radiocontainer>
     <radiobutton value="hehe" caption="lala"/>
     <radiobutton value="hehe" caption="lala"/>
     <radiobutton value="hehe" caption="lala"/>
     <radiobutton value="hehe" caption="lala"/>
</radiocontainer>
 
donc par exemple le tableau d'elemetn de radiocontainer contient 4 pointeur vers radiobutton.
a savoir ke chaque element possede un pointeur vers son pere. donc radiobutton a un pointeur vers radiocaontainer.
le truc c ke g besoin ke radiocontainer appelle des fonctions de radiobutton et vice versa.
hors comme c de classe n'ont comme point commun ke ma classe principale, il faut ke je declare les fonction que chacune vont appelé chez l'autre en virtuelle.
definir ces fonctions dans c 2 classes ne me poserait pas pb si je n'avait pas un packet de classes autour ki n'ont pas besoin de ces fonctions specifique a c 2 classes.
 
voila j'espere ke c pas trop confu ce ke je raconte.

Reply

Marsh Posté le 05-11-2004 à 19:41:25    

Panini a écrit :

Ne confond pas fonction virtuelle et virtuelle pure.
 
Une fonction virtuelle pure telle que toto n'est pas définie. Dans ce cas, il faut faire comme chrisbk l'indique.
Une fonction virtuelle simple (pas de = 0) possède une définition, il n'est donc pas nécessaire de la déclarée dans les classes héritées, si tu veux surcharger le comportement.
 
C serait donc valide si tu vires le = 0 et si tu fournis la définition par défaut de toto dans A (mais dans ce cas A n'est plus une interface).


 
ok c ce ke j'avais commencé a faire, mais la raison pour laquelle j'avais passer en virtuelle pure c ke comme la fonction doit retourner qqch ca foirer.
mais en y pensant si je surcharge ca devrait pas poser pb
je test
merci

Reply

Marsh Posté le 05-11-2004 à 19:45:15    

Une fonction virtuelle pure peux aussi être définie. Virtuelle pure veut simplement dire "doit être redéfinie".


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 05-11-2004 à 19:46:31    

HelloWorld a écrit :

Une fonction virtuelle pure peux aussi être définie. Virtuelle pure veut simplement dire "doit être redéfinie".


 
exemple :o ?


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 05-11-2004 à 19:48:05    


 

Code :
  1. virtual void toto::prout()=0
  2. {
  3.    cout<<"caca\n";
  4. }


 
[:itm]


Message édité par chrisbk le 05-11-2004 à 19:48:26
Reply

Marsh Posté le 05-11-2004 à 19:48:53    

Ca marche ça ?


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 05-11-2004 à 19:48:53   

Reply

Marsh Posté le 05-11-2004 à 19:49:08    


Code :
  1. class A
  2. {
  3. public:
  4.     virtual void t() = 0
  5.     {
  6.     }
  7. };


[:dawadtc]
Je sais, ça fait mal...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 05-11-2004 à 19:50:04    

Faut croire.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 05-11-2004 à 19:50:50    

Bon, je vais rajouter un test case alors [:spamafote]


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 05-11-2004 à 19:52:45    

ca compile, mais je sais pas trop a quoi ca sert [:zaib3k]

Reply

Marsh Posté le 05-11-2004 à 19:58:08    

A rendre une classe abstraite.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 05-11-2004 à 19:58:53    

bin y'a pas besoin de definir la fonction pour ca

Reply

Marsh Posté le 05-11-2004 à 20:02:03    

Ben au cas ou c'est nécessaire.

Code :
  1. class A
  2. {
  3. public:
  4.     A() { ptr = new int[ 10 ]; }
  5.     virtual ~A() = 0
  6.     {
  7.         delete [] ptr;
  8.     }
  9. private:
  10.     int * ptr;
  11. };


Mais je suis d'accord, à part faire discuter sur les forums, y'a pas trop d'utilité.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 05-11-2004 à 20:55:59    

Bon pour finir: merci ca marche!

Reply

Marsh Posté le 05-11-2004 à 20:59:14    

HelloWorld a écrit :

Ben au cas ou c'est nécessaire.

Code :
  1. class A
  2. {
  3. public:
  4.     A() { ptr = new int[ 10 ]; }
  5.     virtual ~A() = 0
  6.     {
  7.         delete [] ptr;
  8.     }
  9. private:
  10.     int * ptr;
  11. };


Mais je suis d'accord, à part faire discuter sur les forums, y'a pas trop d'utilité.


 
En effet ^^.

Reply

Sujets relatifs:

Leave a Replay

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