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

  FORUM HardWare.fr
  Programmation

  [C++] Question sur l'héritage et la surcharge de méthodes virtuelles.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Question sur l'héritage et la surcharge de méthodes virtuelles.

n°106928
ayachi
Posté le 02-03-2002 à 00:07:40  profilanswer
 

Pourquoi ne peut-on pas surcharger des méthodes virtuelles dans un héritage ?
Exemple :
class A
{ virtual int f( int ); };
 
class B : public A
{ virtual int f( float ); };
 
class C : public B
{ virtual int f( char ); };
 
Le compilo refuse de compiler mais ça marche si je m'arrête à la classe B. Il parle de méthodes qui risquent d'être cachées.

mood
Publicité
Posté le 02-03-2002 à 00:07:40  profilanswer
 

n°106942
alligator4​21
Posté le 02-03-2002 à 08:41:03  profilanswer
 

Bon ca fait un bail que je n'ai plus fait de C++, donc mes explications risques d'etre un peu foireuses :D
 
1) dans ton code je vois que tu as defini des fonctions virtuelles mais ce sont des donnees en private quand tu ne declare pas explicitement (par default). Donc a la base, tu devrais mettre :
class A
{
public :
  /* toutes les methodes qui accedent
 constructeur
 destructeur
 ... etc */
 virtual int f(int);
private:
 // toutes tes donnees privees
};
Je crois que tu ne dois avoir de fonctions virtuelles que dans tes methodes en public (je suis pas sur)
 
Il y a peut- etre une histoire que tu dois mettre ta methode-acceseur de la classe A en virtuel pure
genre virtual int f = 0; (franchement pas sur non plus :D )
 
Un bon conseil cependant : achetes toi le bouquin de Bjarne Stroussup "le langage c++" : c'est vraiment complet la-dedans et tu trouveras reponse a toutes tes questions (mais c'est trash a lire).
a+

 

[jfdsdjhfuetppo]--Message édité par alligator421--[/jfdsdjhfuetppo]

n°106956
ayachi
Posté le 02-03-2002 à 11:13:11  profilanswer
 

merci de répondre, mais bon c'était un exemple, les méthodes sont en public, de plus en protected c'est très utile aussi ( pour faire une surcharge d'opérateur comme cout << a par exemple )
non ce que je comprends pas, puisque le compilo génère le nom d'une méthode en fonction de son nom et de ses param d'entrées, pourquoi dans la vtable, il remplacer B::f( float ) par C::f( char ) par exemple. Et dans les docs des compilos, tous le font, why ?

n°106977
wpk
Posté le 02-03-2002 à 12:02:47  profilanswer
 

y'a pas bcp de sens à surcharger des methodes virtuelles :
les methodes virtuelles servent au mechanisme de polymorphisme qui est particulierement interessant quand les methodes virtuelles portent la meme signature :
 
exemple qui considere que ta methode f a la meme signature ds toutes les classes heritieres de A:
 
 
A *p1 = new A();
A *p2 = new B();
A *p3 = new C();
 
p1->f(5);
p2->f(5);
p3->f(5);
dans tous ces appels, tu indique au compilo quelle methode appeller seulement au moment de l'instanciation d'une des heritieres de A. Tu peux donc utiliser une instance de B en lieu et place d'une instance de A. Si tu t'amuse ensuite de surcharger, le mechanisme du polymorphisme n'a plus de sens (le linkage peut etre fait en statique). Ceci dit meme si tu vire le virtual, le compilo ne surcharge pas vraiemnent ta methode f qd il y a heritage.
Dans B par exemple, faudra mettre:
 
class B : public A
{
  using A::f;
  int f(float);
};
 
 
pour lui indiquer d'utiliser aussi le f de A.
 
(Si t'est sous visual, moi j'ai pas reussi à faire marcher les using donc tu declares simplement une methode
int f(int toto) { A::f(toto); } )

n°107000
LeGreg
Posté le 02-03-2002 à 14:14:27  profilanswer
 

ayachi a écrit a écrit :

Pourquoi ne peut-on pas surcharger des méthodes virtuelles dans un héritage ?
Exemple :
class A
{ virtual int f( int ); };
class B : public A
{ virtual int f( float ); };
class C : public B
{ virtual int f( char ); };




ce n'est pas un probleme de fonctions virtuelles
c'est parce que tu as des fonctions de definition
trop proches!
 
f(3), 3 peut-etre a la fois un int et un char
le compilateur ne sait pas quelle fonction appeler!
 
ce serait la meme chose si tu avais
class A{
  int f(char);
  int f(int);
};
 
A+
LEGREG

n°107041
ayachi
Posté le 02-03-2002 à 16:26:01  profilanswer
 

legreg a écrit a écrit :

 
ce n'est pas un probleme de fonctions virtuelles
c'est parce que tu as des fonctions de definition
trop proches!
 
f(3), 3 peut-etre a la fois un int et un char
le compilateur ne sait pas quelle fonction appeler!
 
ce serait la meme chose si tu avais
class A{
  int f(char);
  int f(int);
};
 
A+
LEGREG  




 
non non, même avec des objets de types très différents ça passe pas, et pour la surcharge ça peut être utile pour le design pattern visiteur par exemple, pour éviter des visitcontreteA et visitconreteB, et avoir un seul nom de méthode pour la classe visiteur. je sais, au boulot, j'ai du refaire les noms de toutes mes méthodes et les réécrire partout dans le code.
mais bon ce que je voulais c'est la raison théorique qui empêchent de faire ça.


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

  [C++] Question sur l'héritage et la surcharge de méthodes virtuelles.

 

Sujets relatifs
[C++ extreme ...] héritage virtuelle multiple et cast[JAVASCRIPT] Petite question
[javascript]petite questionPetite question sur un éventuel fonct des fonctions en //
[CPP] Une chtit question de noob[HTML] : une question un peu bête !
[delphi] question sur les tableauxAvis au spécialistes du HTML : GRANDE QUESTION !
Question sur les racourcisquestion dur au niveau TRIE d'un array multidimmensionnel
Plus de sujets relatifs à : [C++] Question sur l'héritage et la surcharge de méthodes virtuelles.


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