begin process at 2012 02 08 10:17:26
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

 > UTILITÉ DES FONCTIONS VIRTUELLES

UTILITÉ DES FONCTIONS VIRTUELLES


 Information sur la source

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Tutoriaux Classé sous :virtual, fonction, virtuelle, dérivée, base Niveau :Débutant Date de création :10/10/2006 Vu / téléchargé :8 098 / 199

Auteur : guilhemmartincpp

Ecrire un message privé
Site perso
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce petit bout de code permet de comprendre l'utilité du mot "virtual" pour les fonctions.
Il permet de voir quelle fonction est appelée par une instance de la classe suivant si la fonction est virtuelle ou non.
Le zip est contient un projet CodeBlocks. Si vous utilisez un autre logiciel, récupérez le CPP.

Source

  • #include <iostream>
  • class A
  • {
  • public:
  • A()
  • {
  • std::cout << "Construction A" << std::endl;
  • }
  • virtual ~A()
  • {
  • std::cout << "Destruction A" << std::endl;
  • }
  • virtual void QuiSuisJe()
  • {
  • std::cout << "Je suis A" << std::endl;
  • }
  • void QuiSuisJeNonVirtuel()
  • {
  • std::cout << "Je suis A" << std::endl;
  • }
  • };
  • class B:public A
  • {
  • public:
  • B()
  • {
  • std::cout << "Construction B" << std::endl;
  • }
  • ~B()
  • {
  • std::cout << "Destruction B" << std::endl;
  • }
  • virtual void QuiSuisJe()
  • {
  • std::cout << "Je suis B" << std::endl;
  • }
  • void QuiSuisJeNonVirtuel()
  • {
  • std::cout << "Je suis B" << std::endl;
  • }
  • };
  • int main()
  • {
  • A * a_B = new B(); // construction de A et B mais attribution du pointeur à un objet de type A
  • a_B->QuiSuisJe(); // affiche "Je suis B"
  • a_B->QuiSuisJeNonVirtuel(); // affiche "Je suis A" : la fonction de la classe de base est appelée
  • B * b = new B(); // construction de A et B et attribution du pointeur à un objet de type B
  • b->QuiSuisJe(); // affiche "Je suis B"
  • b->QuiSuisJeNonVirtuel(); // affiche "Je suis B"
  • delete a_B;
  • delete b;
  • return 0;
  • }
#include <iostream>


class A
{

public:
    A()
    {
        std::cout << "Construction A" << std::endl;
    }
    virtual ~A()
    {
        std::cout << "Destruction A" << std::endl;
    }
    virtual void QuiSuisJe()
    {
        std::cout << "Je suis A" << std::endl;
    }
    void QuiSuisJeNonVirtuel()
    {
        std::cout << "Je suis A" << std::endl;
    }
    
};

class B:public A
{

public:
    B()
    {
        std::cout << "Construction B" << std::endl;
    }
    ~B()
    {
        std::cout << "Destruction B" << std::endl;
    }
    virtual void QuiSuisJe()
    {
        std::cout << "Je suis B" << std::endl;
    }
    void QuiSuisJeNonVirtuel()
    {
        std::cout << "Je suis B" << std::endl;
    }
};



int main()
{
    A * a_B = new B();                      // construction de A et B mais attribution du pointeur à un objet de type A
    a_B->QuiSuisJe();                       // affiche "Je suis B"
    a_B->QuiSuisJeNonVirtuel();             // affiche "Je suis A" : la fonction de la classe de base est appelée
 
    B * b = new B();                        // construction de A et B et attribution du pointeur à un objet de type B 
    b->QuiSuisJe();                         // affiche "Je suis B"
    b->QuiSuisJeNonVirtuel();               // affiche "Je suis B"
 
    delete a_B;
    delete b;
     
    return 0;
}

 Conclusion

Les fonctions QuiSuisJe et QuiSuisJeNonVirtuel sont les mêmes au mot clé "virtual" près...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   FonctionVirtuelle
    •   .objs
      • main.oTélécharger ce fichier [Réservé aux membres club]7 659 octets
    • fonctionvirtuelle.cbpTélécharger ce fichier [Réservé aux membres club]849 octets
    • fonctionvirtuelle.dependTélécharger ce fichier [Réservé aux membres club]169 octets
    • fonctionvirtuelle.layoutTélécharger ce fichier [Réservé aux membres club]233 octets
    • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier1 424 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture ROGNER UNE IMAGE AVEC QT 4.0
Source avec Zip Source avec une capture UTILITÉ DU DESTRUCTEUR VIRTUEL
Source avec Zip Source avec une capture FONCTIONS DE STD::VECTOR
Source avec Zip Source avec une capture PRÉSENTATION DES FONCTIONS DE STD::LIST
Source avec Zip Source avec une capture [MFC] ONGLET À L'INTÉRIEUR D'UNE DIALOGUE

 Sources de la même categorie

LISTER FICHIERS ET RÉPERTOIRES (MULTIPLATEFORME) par christophedlr
UTILISATION DES TYPELIST EN C++ par wyden
Source avec Zip Source avec une capture QCSSCOMPRESSOR par alphaone
AFFICHAGE D'UN TRIANGLE ISOCELE par nabche
Source avec Zip GESTION D'UNE BIBLOTHEQUE par leclerro19

 Sources en rapport avec celle ci

FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec une capture [C]BOUTON EN SDL par smartties
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70
Source avec Zip Source avec une capture UTILITÉ DU DESTRUCTEUR VIRTUEL par guilhemmartincpp
Source avec Zip FONCTION VIRTUELLES (PROGRAMME SIMPLE ET COMMENTÉ) par ffraggy

Commentaires et avis

Commentaire de max12 le 11/10/2006 01:01:14 administrateur CS

Hum j'avais oublier ce que c'était, en lisant le code sa m'est revenu merci :D

Commentaire de guilhemmartincpp le 11/10/2006 08:14:17

@MAX12 : rien de tel que ce petit exemple simple pour se le remémorer ! ;)

Commentaire de Matt67 le 11/10/2006 21:15:46

bonsoir,

voici la façon dont j'utilise les fonctions virtuelles :

#include <iostream>

class mere
{
public:
virtual void quisuisje() = 0;
};

class fille : public mere
{
public:
virtual void quisuisje();
};

void fille::quisuisje()
{
std::cout << "je suis la fille" << std::endl;
}

class fils : public mere
{
public:
virtual void quisuisje();
};

void fils::quisuisje()
{
std::cout<< "je suis le fils" << std::endl;
}

void ecrit(mere *pTesQui)
{
pTesQui->quisuisje();
}

int main()
{
fille soeurette;
fils frerot;

ecrit(&soeurette);
ecrit(&frerot);

return 0;
}

voili, voilou,

Matt...

Commentaire de guilhemmartincpp le 11/10/2006 21:34:40

Salut Matt,

merci pour ta participation.
Dans ton cas, il s'agit d'une fonction virtuelle pure avec le "virtual void quisuisje() = 0;". Tu construis ainsi une classe abstraite donc non instanciable et tu obliges les classes dérivées à implémenter leurs propres méthodes "quisuisje".

Commentaire de budo le 17/10/2006 11:20:17

bonjour,
dit bon tu obtient la meme chose ok ,
mais pourquoi utiliser virtuel svp (peut etre bete la question ...)
y a t-il un avantage ou un inconvenient

merci de répondre ça m'intéresse

Commentaire de brlecler le 20/10/2006 08:41:34

Je vous rappelle qu'en langage objet, ce que vous appelez "Fonction" s'appelle en réalite une "Méthode".
La moindre des choses pour y comprendre quelque chose en informatique est d'utiliser la bonne terminologie!

Commentaire de guilhemmartincpp le 20/10/2006 19:28:47

@Budo : si tu es dans un projet qui s'occupe par exemple de calculer des temps de parcours suivant un mode de transport. On peut imaginer une classe de base Transport et des classes dérivées Voiture, Avion, Train, qui ont chacune leurs méthodes CalculerTempsParcours. Si tu obtiens une liste de Transport*, tu pourras calculer le temps de parcours en appelant CalculerTempsParcours : le compilateur se chargera d'appeler la bonne méthode sans que tu en aies à te soucier.  

Tu peux exécuter le code suivant pour que ça te paraisse plus clair :

    std::list<Transport*> transports;
    Voiture* clio=new Voiture();
    Train* corail4598=new Train();
    transports.push_back(corail4598);
    transports.push_back(clio);
    
    for(std::list<Transport*>::const_iterator t=transports.begin();t!=transports.end();t++) {
     (*t)->CalculerTempsParcours();
    }

avec les classes qui vont avec :


class Transport {
public:
Transport() {}
virtual int CalculerTempsParcours()=0;
};

class Voiture:public Transport {
public:
Voiture() {}
virtual int CalculerTempsParcours() {std::cout << "CalculerTempsParcours de voiture" << std::endl; return 45;}
};

class Train:public Transport {
public:
Train() {}
virtual int CalculerTempsParcours() {std::cout << "CalculerTempsParcours de train" << std::endl; return 15;}
};

Côté inconvénient, je crois qu'il s'agit d'une question de performance. Tu auras des pertes de performance en utilisant le mot clé 'virtual'. Donc si tu n'en as pas besoin, il faut veiller à ne pas l'utiliser...



Commentaire de guilhemmartincpp le 20/10/2006 19:38:20

@brlecler :

Extrait de wikipedia :

Méthode : "En programmation orientée objet, la méthode est une fonction faisant partie de l'interface d'un objet."
Fonction : "En informatique, une fonction est un ensemble d'instructions réalisant une certaine tâche."

Donc question terminologie, tout va bien, même si j'aurais pu être plus précis.

Commentaire de brlecler le 20/10/2006 20:56:42

He bien justement il s'agit bien là d'une classe donc d'une METHODE et non d'une fonction. La fonction est réservé à la seule programmation structurée.
De plus si Wikipédia est une source très interressante il ne s'agit surtout pas d'un référentiel académique. Il contient beaucoup d'erreur et en l'occurence ici un grosse imprécision.
Donc question terminologie le terme de fonction est tout simplement "FAUX".

Commentaire de guilhemmartincpp le 20/10/2006 21:20:18

On pourrait discuter longuement sur les mots. Je ne suis pas d'accord avec toi mais je te remercie d'avoir apporté un terme plus précis dans tous les cas.

Quant à la valeur de wikipedia, c'est Off Topic, mais je te renvoie pour ton info personnelle à l'article intéressant http://fr.wikipedia.org/wiki/Wikipedia#Encyclop.C3.A6dia_Britannica_et_Wikip.C3.A9dia .

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Faire une base virtuelle pure de classe abstraite pour hériter trois classes de listes chaînées [ par Dralnu ] Boujour &#224; tous, J'ai un petit probl&#232;me... Comment je peux faire pour faire une base virtuelle pure de classe abstraite pour h&#233;riter t C++ Classe virtuelle et héritage [ par freepouy18 ] Bonjour, Voila, j'ai un souci avec l'utilisation de m&#233;thodes virtuelles pures lors de leurs red&#233;finition dans une sous-cla Réseau de neurone à base de fonction radiale [ par AMIR03 ] Salut à tou sos_polynome_dérivée_c++ [ par jetpatdj ] salut! je suis une débutante en prog et je recherche la solution à cet exo en c++; Encire une classe polynôme Avant En données privées : • un entier Fonction virtuelle en C [ par cogno ] Bonjour les amis, ma question est la suivante: Comment simuler une fonction virtuelle en C ? Merci Ecrire une fonction dérivée en c [ par nassim1987 ] Bonjour, j'ai un problème je voudrais créer une fonction( ou programme) dérivée en c, c'est à dire une fonction en c qui prendrait en argument des pa Operation de base (+,-,*,/) fonction en C comment faire ? [ par telecomakram ] Bonjour;je cherche à écrire une fonction en C qui permet de faire des opérations de base arrêt imprévu de thread [ par mayssakh84 ] Bonjour, J'ai une fonction appelé dasn un thread qui fait appel à une fonction chargée à partir d'une dll. Mon problème c'est que parfois , le thread


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales