IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

fonction virtuelles (slicing)


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut fonction virtuelles (slicing)
    bonjour ,
    je suis entrain d'etudier le c++ sur un livre et je suis arrive a l'heritage .
    et voila que je me retrouve dans un sous chapitre ou je n'ai presque rien compris << les fonctions virutelles >> .

    dans ce code , j'ai pas compris l'interet de mettre virtual dans la classe mere (mammifere) et pourquoi les fonctions ont donne un resultat different , alors que si on enleve virtual les fonctions donnent le meme resultat a savoir utiliser la fonction crier Mammifere .


    Voila je compte sur votre aide pour m'expliquer ce qu'il y'a a comprendre sur les fonctions virtuelles parceque cette notion m'a l'air importante et je suis vraiement loin de l'avoir assimile .

    Merci de m'avoir lu.

    voila le code



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #include<iostream>
    using namespace std;
    class Mammifere
    {
    public:
    	Mammifere():w_age(1){}
    	~Mammifere() {}
    	virtual void crier() const {cout<<"les mammiferes ont la parole..."<<endl;}
    protected:
    	int w_age;
    };
     
    class Chien : public Mammifere
    {
    public:
    	void crier ()const {cout<<" WARFff..."<<endl;}
    };
    void valfonction(Mammifere Mammifere_val)
    {
    	Mammifere_val.crier();
    }
    void ptrfonction(Mammifere* p_Mammifere)
    {
    	p_Mammifere->crier();
    }
     
    int main()
    {
    	Mammifere *ptr=0;
    	ptr = new Chien;
     
    	valfonction(*ptr);
    	ptrfonction(ptr);
     
     
     
    	system("PAUSE");
    	return EXIT_SUCCESS;
    }
    Resultat compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    les mammiferes ont la parole...
    WAARff....

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Les fonctions virtuelles parmettents d'appeler une méthode d'un objet en fonction du type réel de l'objet et non de celui qui lui est attribué à la compilation.

    Dans ton exemple, retire le virtual de crier() dans la classe mamifère et regarde ce qu'il se passe dans ptrfonction.
    Sans virtual, ptrfonction va appeller la fonction crier de la classe Mammifere sans se poser de question.
    Avec virtual, sans rentrer dans le detail, ptrfonction va appeller la fonction crier de la classe du type réel de l'objet ! Ici en réalité tu passe un objet de type Chien à ptrfonction. Elle va donc appeller la fonction crier du chien.

    Enfin: tu peux t'amuser à créer d'autres classes dérivant de Mammifere avec leur fonction crier propre, et les passer à ptrfonction.

    Edit:
    Ce code provient il de ton livre ? Si oui, change en, car un new sans delete, OMG quoi.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    Merci monsieur,vous m'avez eclaire je vois maintenant a quoi elle sert .

    edit : oui il provien de mon livre et j'ai juste oublie de metre le delete

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/03/2006, 19h29
  2. Compilation avec des fonctions virtuel pure
    Par vanitom dans le forum C++
    Réponses: 4
    Dernier message: 16/12/2005, 14h37
  3. masquage de fonction virtuelle
    Par julien.sagnard dans le forum C++
    Réponses: 3
    Dernier message: 27/01/2005, 14h00
  4. Réponses: 2
    Dernier message: 07/10/2004, 17h00
  5. fonctions virtuelles
    Par Mau dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 21/11/2003, 09h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo