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 :

Notions de classe abstraite


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Par défaut Notions de classe abstraite
    Bonjour,

    Quand on parle de classe abstraite, on parle d'une classe qui possède au moisn une fonction virtuelle pure.On ne peut pas lui créé d'objet.

    Par contre, une classe possédant une ou plusieurs fonctions virtuelles, comment cette classe est appelée ( classe de base?/classe dérivée)

    Si on parle de classe virtuelle, on parle de bien d'une classe A qui sert de base virtuelle à une autre classe B: class B public virtual A?

    Dans ce cas précis, la classe A est elle forcément une classe abstraite?

    Merci pour vos rectifications

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Quand on parle de classe abstraite, on parle d'une classe qui possède au moisn une fonction virtuelle pure.On ne peut pas lui créé d'objet.
    oui
    Par contre, une classe possédant une ou plusieurs fonctions virtuelles, comment cette classe est appelée ( classe de base?/classe dérivée)
    Ni l'un ni l'autre. une classe de base ou une classe dérivée peut posséder des fonctions virtuelles. En fait une classe peut posséder des fonctions virtuelles, mais ceci n'a d'utilité que si la classe a vocation à devenir classe de base d'autres classes, que ces classes surchargent ces fonctions et que ces fonctions soit appelées à partir de la classe de base
    Si on parle de classe virtuelle, on parle de bien d'une classe A qui sert de base virtuelle à une autre classe B: class B public virtual A?
    Oui. Si B et C dérivent toutes deux de A et que D dérive de B ET C, D aurait deux sous objets A ce qui pose problème. Pour obtenir un seul exemplaire de A dans D, on spécifiera que B et C dérivent virtuellement de A. A est alors une classe de base virtuelle
    Dans ce cas précis, la classe A est elle forcément une classe abstraite?
    Non[/quote]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Par défaut
    [Dans ce cas précis, la classe A est elle forcément une classe abstraite?
    [/quote]
    Non[/quote][/quote]

    Ok, mais alors je reformule, la classe A possède t elle forcément une fonction virtuelle?

    Si oui, cette fonction virtuelle doit elle forcément être substituée la classe B?

    SInon, merci pour ces réponses

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ok, mais alors je reformule, la classe A possède t elle forcément une fonction virtuelle?
    Non. Le problème est simplement d'assurer l'unicité du sous objet A dans les classes dérivées

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Citation Envoyé par diogene
    En fait une classe peut posséder des fonctions virtuelles, mais ceci n'a d'utilité que si la classe a vocation à devenir classe de base d'autres classes, que ces classes surchargent ces fonctions et que ces
    redéfinissent !!! (ou "supplantent", si tu veux rejoindre le putch pour une traduction plus percutante)
    La surcharge est un sucre syntaxique de la famille des polymorphismes ad'hoc. Certains livres de que je déconseille parlent de surdéfinition (en voulant faisant croire que c'est la traduction la plus repandue...)

    overriding <-> redéfinition, supplantation ; polymorphisme d'inclusion (/héritage) ; penser fonctions virtuelles
    overloading <-> surcharge ; polymorphisme ad'hoc ; même nom autre signature


    Parler de classe virtuelle me gêne. Une classe en elle même n'est pas virutelle. En revanche, elle peut servir de classe de base virtuelle dans une hiérarchie -- dans la norme je ne lis que les termes de "virtual base class" et "nonvirtual base class.

    Concernant le définition de classe abstraite:
    Selon la norme, "Une classe abstraite est une classe qui ne peut être utilisée que comme classe de base d'une autre classe ; aucun objet d'une classe abstraite ne peut être créé, à l'exception des sous-objets de classes en dérivant. Une classe est abstraite si elle dispose d'au moins une fonction virtuelle pure."
    Il se trouve que la seule façon d'obtenir une classe non instanciable (quelque soit l'endroit où l'on se trouve (genre dans une fonction d'une classe fille)) est d'avoir une fonction virtuelle pure. Le dernier "si" devient en fait un "si et seulement si".

    Il n'y a pas plus de rapport entre les notions de "classe de base virtuelle" et de "classe abstraite" (ou de virtualité, après reformulation), qu'entre un tire-bouchon et un décapsuleur. Ce sont deux notions orthogonales qui peuvent se compléter, mais pas nécessairement.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    diogene a écrit:
    En fait une classe peut posséder des fonctions virtuelles, mais ceci n'a d'utilité que si la classe a vocation à devenir classe de base d'autres classes, que ces classes surchargent ces fonctions et que ces

    redéfinissent !!! (ou "supplantent", si tu veux rejoindre le putch pour une traduction plus percutante)
    La surcharge est un sucre syntaxique de la famille des polymorphismes ad'hoc. Certains livres de que je déconseille parlent de surdéfinition (en voulant faisant croire que c'est la traduction la plus repandue...)

    overriding <-> redéfinition, supplantation ; polymorphisme d'inclusion (/héritage) ; penser fonctions virtuelles
    overloading <-> surcharge ; polymorphisme ad'hoc ; même nom autre signature
    Nous sommes d'accord
    Je tacherai d'avoir à l'avenir un discours plus puriste

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Par défaut
    Une classe de base possède forcément une fonction virtuelle ( pas forcément pure) qui sera redéfinie par une de ses classes dérivées, non?

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    non.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Par défaut
    Peux tu me donenr un exemple applicatif, d'une classe servant de base à une classe dérivée sans que la première ne possède de membres virtuelles histoire que je cerne mieux l'utilité alors de l'existance de la classe dérivée?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2003
    Messages : 65
    Par défaut
    L'idée est la réutilisation de code. Par exemple tu peux avoir une classe qui fait presque tout ce que tu veux, mais il lui manque tout de même quelque chose. Tu crées alors une nouvelle classe basée sur la première et il ne te reste que les nouvelles fonctionnalités à ajouter plutôt que d'avoir à tout reprendre depuis le début.

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    C'est déjà une différence... La question viens de passer de "est-ce possible" à "est-ce utile". Mais même à la deuxième question, il est possible de répondre positivement, mais c'est moins facile. Quelques exemple :

    - Les classes template qui ne font que donner des informations sur le type instancié, comme std::unary_function

    - Une utilisation pour implémentar (ou empêcher l'implémentation) de fonctions spéciales (constructeurs..), comme dans boost::noncopyable ou dans beaucoup d'utilisations du CRTP (curiously recurring template pattern)

    - Pour optimiser de l'espace mémoire en utilisant l'empty base class optimisation
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  12. #12
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par axile
    L'idée est la réutilisation de code. Par exemple tu peux avoir une classe qui fait presque tout ce que tu veux, mais il lui manque tout de même quelque chose. Tu crées alors une nouvelle classe basée sur la première et il ne te reste que les nouvelles fonctionnalités à ajouter plutôt que d'avoir à tout reprendre depuis le début.
    Il est souvent préférable dans ce genre de situations d'ajouter ces fonctionnalités sous forme de fonctions libres (si on n'a pas de données supplémentaires à gérer) ou d'aggrégation (si on en a).

    Mais j'avoue que dans les cas où l'interface de la classe à étendre est très large, je n'ai pas encore trouvé de meilleure alternative, même si cet héritage d'implémentation ne me satisfait pas vraiment, en particulier à cause des dangers qu'il comporte si l'on détruit un objet de la classe dérivée à partir d'un pointeur sur la classe de base.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. Notion de Classe abstraite?
    Par Christophe Charron dans le forum Android
    Réponses: 6
    Dernier message: 16/08/2011, 22h27
  2. Notion d'héritage et de classes abstraites
    Par Shargat dans le forum C++
    Réponses: 4
    Dernier message: 15/04/2008, 18h27
  3. [Debutant][Conception] Classes abstraites et interface.
    Par SirDarken dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 00h02
  4. Classe abstraite / MVC
    Par caramel dans le forum MVC
    Réponses: 5
    Dernier message: 01/04/2003, 09h27
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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