Virtual ...
Résolu
DrCrow
Messages postés
387
Date d'inscription
Statut
Membre
Dernière intervention
-
overcode Messages postés 119 Date d'inscription Statut Membre Dernière intervention -
overcode Messages postés 119 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Quelqu'un peux m'expliquer a quoi sert exactement le mot clé virtual ( c++ ) , je trouve pas son utilité, et sa me turlupine depuis un bon bout temps ....:S
Merci...
Quelqu'un peux m'expliquer a quoi sert exactement le mot clé virtual ( c++ ) , je trouve pas son utilité, et sa me turlupine depuis un bon bout temps ....:S
Merci...
A voir également:
- Virtual ...
- Virtual dj - Télécharger - DJ & Karaoké
- Virtual clonedrive - Télécharger - Divers Utilitaires
- Atomix virtual dj - Télécharger - DJ & Karaoké
- Virtual dub - Télécharger - Montage & Édition
- Virtual audio cable - Télécharger - Audio & Musique
3 réponses
Ben il te fallait plonger un peu dans un cours de C++ ...
Mais ça reste assez simple. On rencontre le mot clé 'virtual' au niveau des méthodes d'une classe, dans un contexte d'héritage.
Tiens prenons une classe de base, nommée A. Soit B une classé dérivée de A. Au sein des deux classes on retrouve une méthode, disons qu'on la nommera f().
Voilà un peu le décor :
class A
{
...
void f()
{
// code de la méthode f de A
}
...
} ;
class B : public A
{
void f()
{
// code de la méthode f de B
}
...
} ;
Comme tu le vois, pour l'instant y a pas de 'virtual' qui traîne ... Voilà ce que ça donne dans un bout de code comme ça :
A * a = new B() ; // Pointeur de type A qui pointe vers un objet créé en mémoire de type B, c'est permis car les objets de type B hérite de la classe A
la ligne de code :
a->f() ;
exécute la méthode f définie dans la classe A, même si l'objet en mémoire est de type B. Le compilateur ne se casse pas la tête, pour un pointeur de type A, il y va comme un bourrin et appelle la méthode f de la classe A sans même chercher à savoir si quelque chose d'autre existe ...
Maintenant, venons au fait, si on rajoute un 'virtual' :
class A
{
...
virtual void f()
{
// code de la méthode f de A
}
...
} ;
class B : public A
{
void f()
{
// code de la méthode f de B
}
...
} ;
et que l'on exécute la même ligne de code :
a->f() ;
Cette fois-ci, c'est la méthode f de B qui est appelée. Au niveau de l'instruction, le type B n'apparaît pas, et pourtant ... C'est ce que l'on appelle une résolution dynamique à l'exécution : bref on ne va pas exécuter les choses comme des bourrins, mais on va plus jeter un oeil sur l'objet pointé par le pointeur a, et identifier son type exact (ici c'est un objet de type B), et choisir par la suite la méthode f la plus convenable : f de B.
Maintenant, en ce qui concerne l'utilité ... Ben prenons l'exemple d'un jeu, au niveau duquel on utilise une classe de base pour représenter tout ce qui affichable. Disons que la classe de base se nomme 'Affichable'.
Cette classe dispose d'une méthode de base nommée 'afficher()' (ça alors !), et déclarée 'virtual' ...
A partir de cette classe, on dérive tout un autre tas de classe pour représenter les personnages, les décors, les menus, le tableau de bord, ... bref tout ce qui est affichable.
Prenons les classes Personnage, Menu et Carte par exemple : elles dérivent toutes de la classe Affichable et implémentent (redéfinissent pour être exact) la méthode 'afficher()'.
L'utilité te paraîtra ici :
Quelque part dans le code du jeu, on aura écrit un système de gestion de l'affichage, qui répertorie tout ce qui doit être affiché et qui mets à jour l'affichage du jeu.
Avec la résolution dynamique (le mot clé 'virtual' quoi :D), ça devient très simple avec un code tout rikiki :
Affichable * pAff [1000] ; // Tableau d'éléments de type Affichable
for(int i = 0 ; i < 1000 ; ++i)
{
if( pAff[i] )
{
pAff[i] -> affiche() ; // et le tour est joué :D
}
}
Ceci est un exemple. On parcours le tableau où sont stockés des pointeurs sur tous les éléments à afficher. Pour chaque élément, si le pointeur est valide, on appelle la méthode afficher(). A l'exécution, vu que la méthode aura été déclarée 'virtual', on cherchera pour chaque exécution de pAff[i] -> affiche() le type exact de l'objet pointé, puis on exécutera la méthode appropriée.
Le code de mise à jour de l'affichage restera le même, et cela même si on rajoute de nouvelle classe héritant de Affichable.
Seul petit bémol des méthodes 'virtual' : c'est légèrement gourmand en ressources processeur ...
J'espère t'avoir donné un élément de réponse et ne pas t'avoir embrouillé !
Mais ça reste assez simple. On rencontre le mot clé 'virtual' au niveau des méthodes d'une classe, dans un contexte d'héritage.
Tiens prenons une classe de base, nommée A. Soit B une classé dérivée de A. Au sein des deux classes on retrouve une méthode, disons qu'on la nommera f().
Voilà un peu le décor :
class A
{
...
void f()
{
// code de la méthode f de A
}
...
} ;
class B : public A
{
void f()
{
// code de la méthode f de B
}
...
} ;
Comme tu le vois, pour l'instant y a pas de 'virtual' qui traîne ... Voilà ce que ça donne dans un bout de code comme ça :
A * a = new B() ; // Pointeur de type A qui pointe vers un objet créé en mémoire de type B, c'est permis car les objets de type B hérite de la classe A
la ligne de code :
a->f() ;
exécute la méthode f définie dans la classe A, même si l'objet en mémoire est de type B. Le compilateur ne se casse pas la tête, pour un pointeur de type A, il y va comme un bourrin et appelle la méthode f de la classe A sans même chercher à savoir si quelque chose d'autre existe ...
Maintenant, venons au fait, si on rajoute un 'virtual' :
class A
{
...
virtual void f()
{
// code de la méthode f de A
}
...
} ;
class B : public A
{
void f()
{
// code de la méthode f de B
}
...
} ;
et que l'on exécute la même ligne de code :
a->f() ;
Cette fois-ci, c'est la méthode f de B qui est appelée. Au niveau de l'instruction, le type B n'apparaît pas, et pourtant ... C'est ce que l'on appelle une résolution dynamique à l'exécution : bref on ne va pas exécuter les choses comme des bourrins, mais on va plus jeter un oeil sur l'objet pointé par le pointeur a, et identifier son type exact (ici c'est un objet de type B), et choisir par la suite la méthode f la plus convenable : f de B.
Maintenant, en ce qui concerne l'utilité ... Ben prenons l'exemple d'un jeu, au niveau duquel on utilise une classe de base pour représenter tout ce qui affichable. Disons que la classe de base se nomme 'Affichable'.
Cette classe dispose d'une méthode de base nommée 'afficher()' (ça alors !), et déclarée 'virtual' ...
A partir de cette classe, on dérive tout un autre tas de classe pour représenter les personnages, les décors, les menus, le tableau de bord, ... bref tout ce qui est affichable.
Prenons les classes Personnage, Menu et Carte par exemple : elles dérivent toutes de la classe Affichable et implémentent (redéfinissent pour être exact) la méthode 'afficher()'.
L'utilité te paraîtra ici :
Quelque part dans le code du jeu, on aura écrit un système de gestion de l'affichage, qui répertorie tout ce qui doit être affiché et qui mets à jour l'affichage du jeu.
Avec la résolution dynamique (le mot clé 'virtual' quoi :D), ça devient très simple avec un code tout rikiki :
Affichable * pAff [1000] ; // Tableau d'éléments de type Affichable
for(int i = 0 ; i < 1000 ; ++i)
{
if( pAff[i] )
{
pAff[i] -> affiche() ; // et le tour est joué :D
}
}
Ceci est un exemple. On parcours le tableau où sont stockés des pointeurs sur tous les éléments à afficher. Pour chaque élément, si le pointeur est valide, on appelle la méthode afficher(). A l'exécution, vu que la méthode aura été déclarée 'virtual', on cherchera pour chaque exécution de pAff[i] -> affiche() le type exact de l'objet pointé, puis on exécutera la méthode appropriée.
Le code de mise à jour de l'affichage restera le même, et cela même si on rajoute de nouvelle classe héritant de Affichable.
Seul petit bémol des méthodes 'virtual' : c'est légèrement gourmand en ressources processeur ...
J'espère t'avoir donné un élément de réponse et ne pas t'avoir embrouillé !
>>> J'espère t'avoir donné un élément de réponse et ne pas t'avoir embrouillé !
SiiSiii, je comprend bien, même si sa échappe parfois ^^....sa m'as bien aider par contre, c'est vraiment bien expliquer, surtout avec l'exemple......, merci a toi mon ami, sa m'as vraiment aidé, sa m'a fait une idée de quoi ressemble le Mystérieux "Virutal" ...^^
De mon coté, je vais encore approfondir dans le tas, pour bien maitriser ..
et sur ce, Bonne soirée ....
DrCrow
SiiSiii, je comprend bien, même si sa échappe parfois ^^....sa m'as bien aider par contre, c'est vraiment bien expliquer, surtout avec l'exemple......, merci a toi mon ami, sa m'as vraiment aidé, sa m'a fait une idée de quoi ressemble le Mystérieux "Virutal" ...^^
De mon coté, je vais encore approfondir dans le tas, pour bien maitriser ..
et sur ce, Bonne soirée ....
DrCrow