[C++] mot cle VIRTUAL - a quoi ca sert ?

mot cle VIRTUAL - a quoi ca sert ? [C++] - Programmation

Marsh Posté le 07-06-2001 à 16:56:17    

salut !
Une petite question de base pour vous surement mais qui me turlupine un peu !!!
 
le mot cle virtual, a quoi qu'il sert donc ?
 
z'avez pas une bonne explication car moi y en a pas comprendre son usage.

Reply

Marsh Posté le 07-06-2001 à 16:56:17   

Reply

Marsh Posté le 07-06-2001 à 17:38:01    

huhu ... à déclarer des fonctions virtuelles, cad overridables / overloadables par leur classes dérivées, qui peuvent ainsi choisir de changer ou surcharger le comportement des dites fonctions.
 
ie  
 
class A
{
public:
    virtual  MyMethod()  { printf("hello from A" ); }
}
 
class B : public A
{
public:
    virtual  MyMethod()  { printf("hello from B" ); }
}
 
class C : public B
{
public:
    virtual  MyMethod()  { B::MyMethod(); printf("hello from C" ); }
}
 
soit a une instance de A, b une instance de B, c une instance de C
 
a->MyMethod() affiche ("hello from A" );
b->MyMethod() affiche ("hello from B" );
c->MyMethod() affiche ("hello from B", "Hello from C" );
 
une classe dérivée de A peut donc overrider / overloader une méthode de A déclarée comme virtuelle.
 
B->MyMethod() est un override : il change le comportement de la fonction.
C->MyMethod() est un overload : il surcharge la fonction et permet l'apport de nouvelles fonctionnalités.
 
est ce clair ?
 
sachant que tu devrais lire un bouquin sur le c++ & co quand même :D

Reply

Marsh Posté le 07-06-2001 à 17:55:19    

OK merci pour tes explications.

Reply

Marsh Posté le 07-06-2001 à 18:57:17    

en fait ce qui fait l'interret du virtual c'est plutot le polymorphisme:
 
dans l'exemple precedent, ce qu'il y a de rigolo c'est que si t'as par exemple:
 
A *unA=new B(...);
 
unA->myMethod(...);
 
ca vas etre la version de B qui sera appelle
Le mot clef virtual sert au compilo pour rajouter un pointeur sur la methode declare virtual dans la table des fct virtuelles
(vtable)
 
PS: la surcharge c'est pas ce que t'as indique youdontcare, la surcharge c'est quand tu change le prototype de la fonction.

Reply

Marsh Posté le 07-06-2001 à 20:10:58    

je suis plutot d'accord avec la version de wpk. youdontcare, t'as besoin de declarer les fonctions virtuelles pour faire ce qui tu as fait. Le virtuel, c'est pour le polymorphysme.

Reply

Marsh Posté le 07-06-2001 à 21:59:21    

OK merci les gars !
vous avez eclaire ma lanterne.

Reply

Marsh Posté le 08-06-2001 à 09:40:25    

youdontcare -> ta definition override/overload est fausse : ca ne repose pas du tout sur ce qui se passe a l'interieur de la methode, mais bien sur sa signature:
 
L'overloading, c'est par exemple : A::affiche(int) et A::affiche(char) : deux methodes ont le meme nom, mais prennent des arguments de nature differente.
 
L'overriding, c'est par exemple A::affiche(int) et B::affiche(int) : la meme methode est surchargee dans une classe fille.

 

[edit]--Message édité par Gonzoide--[/edit]

Reply

Marsh Posté le 08-06-2001 à 09:46:26    

Gonzoide

Citation :

L'overriding, c'est par exemple A::affiche(int) et B::affiche(int) : la meme methode est surchargee dans une classe fille.


 
pas surchargée mais redefinie  ;)  (c'est juste un point de vocabulaire ton explication sinon est exacte)

Reply

Marsh Posté le 08-06-2001 à 09:55:07    

oups :)
 
C'etait juste pour dire que la difference override/overload n'est pas que philosophique, mais repose bien sur des criteres connus a la compilation

Reply

Sujets relatifs:

Leave a Replay

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