Fonctions virtuelles en c++

Résolu/Fermé
chaoucholfa Messages postés 44 Date d'inscription mercredi 6 mars 2013 Statut Membre Dernière intervention 4 novembre 2014 - Modifié par mamiemando le 19/04/2013 à 01:32
mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 - 20 avril 2013 à 00:33
Bonsoir,

S'il vous plaît, je n'ai rien compris de l'utilité des fonctions virtuelles...

Merci de m'aider .
A voir également:

3 réponses

mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 7 803
19 avril 2013 à 01:01
Contrairement à java le lien dynamique n'est pas activé par défaut en C++. Suppose que dans une classe "Mere" tu définis la méthode "f" et dans une classe "Fille" qui hérite de "Mere" tu surcharges cette méthode, alors le lien dynamique peut avoir son importance.

#include <iostream>

class Mere1 {
    public:
         void f() { 
            std::cout << "Mere1" << std::endl;
        }
};

class Fille1 : public Mere1 {
    public:
         void f() { 
            std::cout << "Fille1" << std::endl;
        }
};

class Mere2 {
    public:
        virtual void f() {
            std::cout << "Mere2" << std::endl;
        }
};

class Fille2 : public Mere2 {
    public:
         void f() { 
            std::cout << "Fille2" << std::endl;
        }
};

int main() {
    Fille1 f1;
    Mere1 & m1 = f1;
    m1.f();

    Fille2 f2;
    Mere2 & m2 = f2;
    m2.f();
    return 0;
} 


... retourne :

Mere1
Fille2


En effet, sans lien dynamique (version 1), f est appelé sur m1, qui est de type Mere1. Bien qu'en réalité ce soit un objet de type Fille1, le C++ ne résout pas dynamiquement (lien dynamique) ie à l'exécution que l'on parle d'une instance de type FIlle1. Il appelle donc la méthode de Mere1. Ce choix est décidé à la compilation, donc le C++ n'a pas a à explorer les héritages et inspecter les types pour savoir quelle méthode appeler.

Au contraire, avec un lien dynamique (version 2), f a beau être appelé sur une variable de type Mere2, le C++ voit à l'exécution qu'il s'agit en réalité d'une référence sur une instance de type Fille2. Comme cette méthode a été surchargée dans Fille2, c'est la plus "spécifique" et c'est donc celle qui est appelée. Dans le cas général, pour savoir quelle méthode appelé, il faut étant donné le type évalué à l'exécution (ici Fille2) remonter de classe mère en classe mère jusqu'à trouver une définition de la méthode invoquée.

À ce stade on voit donc que fonctionnellement parlant, le résultat est complètement différent.

Considérons un exemple un peu plus compliqué si tu as C4 qui hérite de C3 qui hérite de C2 qui hérite de C1 qui hérite de C0 et que f a été (re)définie dans C0 et C1, si tu l'appliques à une instance de C4 (par le biais d'une référence de type C0 par exemple) alors il faut regarder dans C4, puis dans C3, puis dans C2, puis enfin dans C1 pour s'apercevoir que c'est bien la méthode de C1 qu'il faut appeler.

Comme cette résolution dégrade un peu les performances, c'est pour ça que le lien dynamique est par défaut désactivé en C++.

Bonne chance
2
chaoucholfa Messages postés 44 Date d'inscription mercredi 6 mars 2013 Statut Membre Dernière intervention 4 novembre 2014
19 avril 2013 à 15:29
merci beaucoup c'est gentil
0
mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 7 803
20 avril 2013 à 00:33
De rien, conne continuation :-)
0