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 :

Héritage et classe abstraite : cas spécial - Quelle est la meilleure méthode ?


Sujet :

C++

  1. #1
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut Héritage et classe abstraite : cas spécial - Quelle est la meilleure méthode ?
    Bonjour,

    je me retrouve a devoir créer une base commune à 4 classes. Cette classe parente ne doit pas être instanciable. Pourtant pour la première fois je ne vois pas quelle méthode serait à redéfinir partout plus bas.

    Quelle est la meilleure méthode dans ce cas pour empêcher l'instanciation de la classe mère sans définir de méthode virtuelle pure ? Est-ce que déclarer une méthode virtuelle pure mais la définir quand même dans la classe de base est une solution envisageable ?

    Merci d'avance.
    Nullius in verba

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Citation Envoyé par Kaamui Voir le message
    Pourtant pour la première fois je ne vois pas quelle méthode serait à redéfinir partout plus bas.
    Le destructeur (mais il faut quand même fournir une implémentation).

    Au passage : toutes les classes (potentiellement) mères doivent avoir leur destructeur en virtual.
    FAQ C++ - Pourquoi le destructeur d'une classe de base doit être public et virtuel ou protégé et non virtuel ?

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Si la méthode est virtuelle et définit, elle n'est pas pure.

    Pour empêcher l'instancier: constructeur en protégés.
    Si le but n'est pas de l'utiliser directement (comprend ne pas en connaître l’existence pour l'utilisateur): destructeur protégé et héritage protégé.

    Pas de destructeur virtuelle dans cette catégorie de classe, la classe de base n'ai jamais directement utilisée.

  4. #4
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Tu es sûr de ce que tu dis ?

    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
    // g++ -Wall -Wextra -Wconversion -std=c++11 -pedantic -O3 -march=native -fopenmp main.cpp -o main && ./main
     
    #include <iostream>
    #include <memory>
     
     
    class A
    {
    public:
     
    	A() { std::cout << "A" << std::endl; }
     
    	virtual ~A() = 0;
    };
     
    // Si n'existe pas : erreur de link : référence indéfinie vers « A::~A()
    A::~A() { std::cout << "~A" << std::endl; }
     
     
    class B : public A
    {
    public:
     
    	B() { std::cout << "B" << std::endl; }
     
    	~B() { std::cout << "~B" << std::endl; }
    };
     
     
    int main()
    {
    	//std::unique_ptr<A> p0(new A()); // error: cannot allocate an object of abstract type ‘A’
     
    	std::unique_ptr<A> p1(new B()); // A B ~B ~A
     
    	return 0;
    }
    PS :
    Citation Envoyé par jo_link_noir Voir le message
    Si le but n'est pas de l'utiliser directement (comprend ne pas en connaître l’existence pour l'utilisateur): destructeur protégé et héritage protégé.
    FAQ C++ - Quand dois-je faire un héritage public ? protégé ? privé ?
    - public : uniquement si l'héritage porte une sémantique EST-UN ;
    - privé : lorsque l'héritage porte une sémantique EST-IMPLEMENTE-EN-TERMES-DE et ne supporte pas la sémantique EST-UN ;
    - protégé : si vous avez une bonne raison, la rédaction sera curieuse de la connaître.

  5. #5
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Ah tient, c'est marrant, je ne savais pas. Quel est l’intérêt ?

    - public : uniquement si l'héritage porte une sémantique EST-UN ;
    - privé : lorsque l'héritage porte une sémantique EST-IMPLEMENTE-EN-TERMES-DE et ne supporte pas la sémantique EST-UN ;
    - protégé : si vous avez une bonne raison, la rédaction sera curieuse de la connaître.
    Aucune, au début j'ai mit les 2 puis j'en ai supprimé un... En fait le fil de ma pensée était : avec un héritage protégé les classes filles peuvent accéder aux méthodes de la base avec un héritage protégé ; ce qui se justifie dans un arbre d'héritage sur un ensemble de "EST-IMPLEMENTE-EN-TERMES-DE"...
    Oui, je n'ai pas réfléchi au bien fondé de cette pensée .
    Puis c'est vrai que même dans cette logique le dernier doit être un héritage privé.

  6. #6
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Merci pour ta réponse Ehonn, c'est noté pour le destructeur.

    Mais la question était surtout de savoir si la méthode que j'appliques et dont tu parle aussi (virtuelle pure, mais implémentée qd même), était correcte vis-à-vis du standard ?
    Nullius in verba

  7. #7
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    J'ai jamais lu la norme là dessus. Mais GCC et Clang compilent sans warning

  8. #8
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Kaamui Voir le message
    Mais la question était surtout de savoir si la méthode que j'appliques et dont tu parle aussi (virtuelle pure, mais implémentée qd même), était correcte vis-à-vis du standard ?
    Oui.

    Citation Envoyé par Le standard, 10.3/11
    A virtual function declared in a class shall be defined, or declared pure (10.4) in that class, or both; but no diagnostic is required
    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.

  9. #9
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Génial ! Merci

    C'est exactement la réponse qu'il me fallait !

    Ps : "envoyé par Le standard .."
    Nullius in verba

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/01/2009, 22h47
  2. Réponses: 2
    Dernier message: 10/07/2008, 12h29
  3. [HTML] quelle est la meilleure méthode pour changer la langue d'un site?
    Par poupouille dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/02/2008, 12h17
  4. Réponses: 12
    Dernier message: 10/08/2006, 09h44
  5. Réponses: 20
    Dernier message: 27/06/2006, 17h42

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