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

Langage C++ Discussion :

h�ritage et m�thode virtuelle


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par d�faut h�ritage et m�thode virtuelle
    Bonjour,

    Je viens r�guli�rement sur le site et le forum quand j'ai des questions de code et aujourd'hui j'ai une question � laquelle je n'ai pas encore trouv� de r�ponse.

    Supposons que plusieurs classes h�ritent d'une m�me classe m�re. Cette classe m�re a (entre autres) une m�thode virtuelle. Est ce qu'il a un moyen de savoir si cette m�thode a �t� red�finie dans les classes enfants ou pas?

    Merci d'avance!

  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
    Je ne peux pas le garantir � 100% (il y'a peut �tre quelques hacks que je ne connais pas) mais je dirais que non.

    La vraie question est : Pourquoi as tu besoin de savoir cela ?
    "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
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut, et bienvenue sur le forum

    De prime abord, je dirais que non, et que, de toutes mani�res, tu n'a a priori aucun besoin de le savoir

    Ceci dit, je me demande si ta question ne porte pas plut�t sur comment �tre s�r qu'une fonction virtuelle sera red�finie dans les classes d�riv�es...

    Dans ce cas, la cl� r�side dans l'utilisation de fonction(s) virtuelle(s) pure(s), �ventuellement associ�e(s) avec l'idiome NVI (Non Virtual Interface).

    NB: une classe dans laquelle il existe une fonction virtuelle pure est, par d�finition m�me ce que l'on appelle une classe abstraite.

    Il est donc impossible d'instancier une classe dans laquelle il existe une fonction virtuelle pure (par contre, il est possible de faire passer l'instance d'une classe d�riv�e pour une instance de la classe parent), tout comme il est impossible d'instancier une classe d�riv�e dans laquelle toutes les fonctions virtuelles pures n'auront pas �t� red�finies
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  4. #4
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50

    Informations professionnelles :
    Activit� : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par d�faut
    je confirme pour le virtuelle pure, qui va te forcer d'impl�menter la m�thode dans toutes les classes filles


    cependant si ce n'est pas ton besoin, tu peux le g�rer de fa�on manuelle avec un simple bool�en/compteur priv� dans la classe m�re que tu met a jour dans la m�thode virtuelle de ta classe m�re et encore c'est un peu bancal, tu peux aussi jeter une exception qui ne sera pas jet� dans les filles, mais la m�thode virtuelle pure est une bien meilleure approche.....
    j'ai du mal a voir le besoin....

  5. #5
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par jabbounet Voir le message
    jcependant si ce n'est pas ton besoin, tu peux le g�rer de fa�on manuelle avec un simple bool�en priv� dans la classe m�re que tu met a jour dans la m�thode virtuelle de ta classe m�re et encore c'est un peu bancal.....
    C'est m�me tout � fait bancal, dans le sens o� ce bool�en ne serait de toute fa�on pas mis � jour avant l'invocation de la fonction virtuelle (du moins dans la version que tu pr�sente)...

    Ainsi un code proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    Base* b = new Derivee;
    std::cout<<b->isReimplemented()<<std::endl;
    b->foo();
    std::cout<<b->isReimplemented()<<std::endl;
    donnerait pour le premier appel de isReimplemented (qui ne ferait que v�rifier le bool�e) un r�sultat faux alors que le deuxi�me donnerait un r�sultat vrai

    La solution serait alors de mettre ce bool�en � jour dans le constructeur, mais... nous serons alors confront� au probl�me majeur de l'erreur humaine et de la loi de Finagle: tu trouveras toujours un "imb�cile" pour oublier de mettre le booleen � jour lorsqu'il red�finit la fonction virtuelle ou un autre pour mettre le bool�en � jour alors... qu'il n'a pas red�fini la fonction virtuelle...

    Bref, le mot bancal est faible
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par d�faut
    Merci pour vos r�ponses.

    En fait, j'utilise des biblioth�ques de physique qui ont �t� d�velopp�es par d'autres personnes.
    Par d�faut dans la classe m�re cette m�thode va faire certains calculs. Ces calculs par d�faut ne m'int�ressent pas. Cette m�thode ne m'int�resse que pour les classes enfants qui la red�finissent. Le probl�me c'est que cette m�thode est appel�e plusieurs milliards de fois et je ne veux pas faire les calculs par d�fauts de la classe m�re pour les classes enfants qui ne red�finissent pas cette m�thode (pour essayer de gagner un peu de temps de calcul). Et j'aimerais �viter de retoucher aux biblioth�ques de bases.

  7. #7
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par cibatro Voir le message
    Merci pour vos r�ponses.

    En fait, j'utilise des biblioth�ques de physique qui ont �t� d�velopp�es par d'autres personnes.
    Par d�faut dans la classe m�re cette m�thode va faire certains calculs. Ces calculs par d�faut ne m'int�ressent pas. Cette m�thode ne m'int�resse que pour les classes enfants qui la red�finissent. Le probl�me c'est que cette m�thode est appel�e plusieurs milliards de fois et je ne veux pas faire les calculs par d�fauts de la classe m�re pour les classes enfants qui ne red�finissent pas cette m�thode (pour essayer de gagner un peu de temps de calcul). Et j'aimerais �viter de retoucher aux biblioth�ques de bases.
    Tu n'as donc absolument pas besoin de savoir si la fonction est red�finie dans tes propres classes, tout ce dont tu as besoin, c'est d'utiliser le polymorphisme qui est induit par le fait que les fonctions sont virtuelles

    Le polymorphisme assure que, quel que soit le type D qui h�rite d'une classe B, si tu fais appel � une m�thode d�finie dans B (et red�finie dans D), ce sera le comportement propre au D qui sera appel�... Et c'est exactement ce que tu souhaite
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  8. #8
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50

    Informations professionnelles :
    Activit� : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par d�faut
    Citation Envoy� par cibatro Voir le message
    Merci pour vos r�ponses.

    je ne veux pas faire les calculs par d�fauts de la classe m�re pour les classes enfants qui ne red�finissent pas cette m�thode (pour essayer de gagner un peu de temps de calcul). Et j'aimerais �viter de retoucher aux biblioth�ques de bases.
    tu fait une m�thode vide dans tes classe filles (en esp�rant ne pas en oublier.)

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par d�faut
    Oui mais je n'ai pas d�velopp� les classes enfants. Les d�veloppeurs n'ont pas mis de m�thode vide car dans la plupart des cas on a besoin des calculs r�alis�s dans la m�thode de la classe m�re.

    Je pourrais modifier les biblioh�ques pour mon application mais comme ces biblioth�ques sont susceptibles d'�voluer je voulais essayer de faire quelque chose d'un peu propre.

  10. #10
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 50

    Informations professionnelles :
    Activit� : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par d�faut
    Citation Envoy� par cibatro Voir le message
    Oui mais je n'ai pas d�velopp� les classes enfants. Les d�veloppeurs n'ont pas mis de m�thode vide car dans la plupart des cas on a besoin des calculs r�alis�s dans la m�thode de la classe m�re.

    Je pourrais modifier les biblioh�ques pour mon application mais comme ces biblioth�ques sont susceptibles d'�voluer je voulais essayer de faire quelque chose d'un peu propre.
    dans ton appli tu faits des enfants des classe filles dont tu te sert et de celle que tu souhaite ne pas appeler l'algo de la grand-maman et tu les utilise...

    pas besoin de changer la lib pour �a (si c'est une contrainte forte de ne pas la changer). apr�s cela te fais g�rer des petits enfants et �a complique un peu mais tu ne modifie pas ta lib.

  11. #11
    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
    Suffit de cr�er une classe tampon qui va annuler le calcul que tu veux et ne manipuler plus que ca.
    Exemple
    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
     
    class Base // classe pas faite par toi
    {
    public:
    virtual void foo() {/*plein de truc compliqué*/}
    };
     
    class Tampon : public Base // classe faite par toi
    {
    public:
    virtual void foo() {/*rien*/}
    };
     
    //ensuite tes classes qui héritent de Tampon
    class D1 : public Tampon
    {
    public:
    virtual void foo() {/*calcul 1*/}
    };
     
    class D2 : public Tampon
    {
    public:
    virtual void foo() {/*calcul 2*/}
    };
     
    //après, suffit de manipuler des Tampon* pour avoir le polymorphisme avec ses enfants et plus de problème de calcul inutile.
    "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)

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par d�faut
    Ah ben, oui. Tu as raison jabbounet c'est le plus simple!

    Merci � tous!

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. m�thode virtuelle dans h�ritages
    Par bobby51 dans le forum Langage
    R�ponses: 4
    Dernier message: 21/02/2010, 20h36
  2. m�thode virtuelle pure et h�ritage
    Par Invit� dans le forum Langage
    R�ponses: 3
    Dernier message: 20/07/2009, 23h12
  3. h�ritage et m�thodes virtuelles ?
    Par Didine981 dans le forum C++
    R�ponses: 4
    Dernier message: 08/12/2007, 14h43
  4. R�ponses: 8
    Dernier message: 16/07/2007, 14h38
  5. R�ponses: 13
    Dernier message: 23/05/2006, 13h06

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