none
Classe abstraite et méthode virtuelle

    Discussion générale

  • Bonjour,

    A l'issue d'une interrogation précédente (d'un genre "quasi philosophique"), Alex Petrescu m'a bien dépanné par sa réponse pertinente et il s'est dit intéressé par d'autres questions ...

    C'est pourquoi je lui dédie les 2 questions suivantes (mais toutes les idées sont bienvenues) :

    Quelle pourrait être l’utilité d’une classe abstraite (donc non instanciable) qui ne possède aucune méthode virtuelle à part son destructeur et qui ne peut donc pas servir le polymorphisme ?

    Quelle pourrait être l’utilité d’implémenter les méthodes virtuelles pures dans une classe (non instanciable) alors qu’elles doivent obligatoirement être redéfinies dans les classes dérivées ?


    Merci d'avance,

    Philippe
    dimanche 7 mars 2010 17:46

Toutes les réponses

  • Bonjour,

     

    Une des raisons que je vois pour déclarer un destructeur virtuel est d’empêcher la classe d’être instanciée, sans devoir déclarer une autre méthode virtuelle pure. Par contre, on peut avoir d’autres méthodes normales dans la classe  de base qui seront héritées par les classes dérivées, le seul but de la classe de base abstraite étant de forcer la définition des classes dérivées.

    Une observation : si je déclare seulement le destructeur virtuel pur, j’ai une erreur de linkage. Je dois aussi implémenter le destructeur pour pouvoir compiler. Ca n’élimine pas le caractère abstract de la classe, car le destructeur est toujours virtuel pure et on ne peut pas instancier la classe parent. Si vous avez un autre exemple qui marche sans l’implémentation du destructeur dans la classe de base, je suis intéressé.

     

    Pour le deuxième problème, je vois cette déclaration des méthodes virtuelle pures comme la déclaration d’une interface. Donc on établit au début que la famille de classes doit implémenter les méthodes M1 et M2, et on les déclare comme méthodes virtuelles pures dans la classe de base. Les classes enfant doivent forcement implémenter ces méthodes, mais chacune peut choisir le moyen d’implémentation. Disons qu’on a une classe de base « Mobile » avec les méthodes virtuelles pures Start et Stop. Les classes dérivées, « Avion » et « Bateau », disons, doivent avoir ces méthodes, pour faire des actions au démarrage et arrêt, car si on manque une de ces méthodes on n’a plus la logique d’un mécanisme mobile. Mais le choix de la mobilité est particulier pour chacune de ces classes. La première est basée sur décoller - atterrir et la deuxième est basée sur … J bon, ce que les bateaux font d’habitude.

     

    Ce n’est pas une description exhaustive ce que j’ai fait ici. Je suis sûr qu’on a plusieurs réponses et qu’il existe des explications plus détaillées, dons je suis intéressé de continuer ce sort de discussions.

     

    Je vous félicite pour le choix de vos sujets, ils sont très intéressants.

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    lundi 8 mars 2010 15:12
  • Merci pour ces réponses intéressantes.

    Toutefois, elles ne me satisfont qu'à moitié ..., mais je suis conscient que ces questions sont empreintes d’un certain degré de « débilité ». C’est tout moi … ;-)

     

    S’il devait m’arriver une réponse qui satisfasse tout-à-fait mon questionnement, je vous la communiquerais pour information.

     

    Merci encore. Je ne manquerai pas de vous soumettre d’autres questions si l’occasion se présente.

     

    Cordialement,

     

    Philippe

    mardi 9 mars 2010 15:40
  • Bonjour,

     

    Si vous trouvez des explications plus intéressantes, je vous invite de continuer la discussion sur ce thread. Et, comme c’est une problème qui ne semble pas avoir des réponses définitives, je crois qu’il sera mieux de changer le type de ce thread.

     

    Pour clarification, est-ce que vous avez un scenario spécifique pour cette implémentation, ou c’est juste une question théorétique ? J

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    mercredi 10 mars 2010 10:23
  • Bonjour,


    Il s'agit seulement d'une étude théorique. Je travaille cette matière pour la soumettre ensuite à des étudiants en informatique.

    Sauf distraction de ma part, les questions que je pose sur des forums sont généralement celles qu'on ne pose jamais.
    La raison en est qu'en travaillant cette matière, les questions m'apparaissent et je peux y repondre par des affirmations du genre "ça n'a pas de sens", ou pour répondre aux deux questions posées : "Il n'existe probablement aucune utilité à faire cela ...".

    Mais voilà, je me dis que s'il existe un étudiant capable de poser une telle question, les réponses que je livre ici en exemple ne sont pas convenables. Elles expriment la trivialité, ce que tout professionnel peut recevoir "comme de bien entendu".
    Mais les étudiants ne sont pas encore des professionnels avec une expérience qui permet de "sentir" tout de suite la "profondeur" de réponses aussi "vagues".

    C'est pourquoi je cherche des exemples, des cas de figures, qui montrent soit la pertinence du propos, soit sa stupidité.


    Cordialement,

    Philippe

    mercredi 10 mars 2010 11:16
  • Bonjour,


    J'ai une réponse valable à la deuxième question. Je vous la soumets comme promis.

    La question était :

    Quelle pourrait être l’utilité d’implémenter les méthodes virtuelles pures dans une classe (non instanciable) alors qu’elles doivent obligatoirement être redéfinies dans les classes dérivées ?

    Réponse :

    Fournir des méthodes "par défaut" aux classes dérivées.

    Exemple :

    Soit une classe abstraite CMere :

     

    class CMere

    {

    private :

    // ...

    public :

          CMere (void);

          virtual ~CMere (void) =0;

    // ...

          virtual double UnePolymorphe(void) =0;   // Méthode virtuelle pure

    };

     

    La méthode virtuelle est implémentée dans cette classe :

     

    double CMere::UnePolymorphe()

    {

    return (quelque chose qui convient à tout le monde) ;

    }

     

      

     

    Soit une classe dérivée CDerivee :

     

    class CDerivee : CMere

    {

    private :

    // ...

    public :

          CDerivee (void);

          ~CDerivee (void);

    // ...

          double UnePolymorphe(void);  // Redéfinition

    };

     

    Le programmeur de CDerivee n’a pas envie de développer l’algorithme nécessaire à la méthode UnePolymorphe. Il l’implémente comme ceci :

     

    double CDerivee::UnePolymorphe()

    {

    return (CMere::UnePolymorphe());

    }

     


    Dans le cas de cette question, l'exemple illustre que le propos n'est pas tout-à-fait stupide (contrairement à ce que je croyais ...).



    Cordialement,

    Philippe






    mercredi 10 mars 2010 15:36
  • Bonjour,


    J'ai une réponse valable à la deuxième question. Je vous la soumets comme promis.

    La question était :

    Quelle pourrait être l’utilité d’implémenter les méthodes virtuelles pures dans une classe (non instanciable) alors qu’elles doivent obligatoirement être redéfinies dans les classes dérivées ?

    Réponse :

    Fournir des méthodes "par défaut" aux classes dérivées.

    Exemple :

    Soit une classe abstraite CMere :

     

    class CMere

    {

    private :

    // ...

    public :

          CMere (void);

          virtual ~CMere (void) =0;

    // ...

          virtual double UnePolymorphe(void) =0;   // Méthode virtuelle pure

    };

     

    La méthode virtuelle est implémentée dans cette classe :

     

    double CMere::UnePolymorphe()

    {

    return (quelque chose qui convient à tout le monde) ;

    }

     

      

     

    Soit une classe dérivée CDerivee :

     

    class CDerivee : CMere

    {

    private :

    // ...

    public :

          CDerivee (void);

          ~CDerivee (void);

    // ...

          double UnePolymorphe(void);  // Redéfinition

    };

     

    Le programmeur de CDerivee n’a pas envie de développer l’algorithme nécessaire à la méthode UnePolymorphe. Il l’implémente comme ceci :

     

    double CDerivee::UnePolymorphe()

    {

    return (CMere::UnePolymorphe());

    }

     


    Dans le cas de cette question, l'exemple illustre que le propos n'est pas tout-à-fait stupide (contrairement à ce que je croyais ...).



    Cordialement,

    Philippe

    mercredi 10 mars 2010 19:42