CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] À propos des classes abstraites

chris_27
chris_27
Niveau 10
25 février 2012 à 00:23:03

Note: ce message fait suite à la discussion qui se situe ici =
https://www.jeuxvideo.com/forums/1-47-61904-2-0-1-0-c-question-de-poo.htm#message_61975

« Si, je te dis que classe abstraite = abstraite pure, c'est un abus de langage. » :d) non, non, et encore non. C'est toi qui n'a pas compris toutes les subtilités des classes abstraites en C++. Tu pourras me chanter tout ce que tu voudras mais :

class Pure
{
    public:
        virtual ~Pure() =0;
};

est une classe virutelle (le destructeur est une méthode virtuelle à cause du mot clé virtual) pure (le destructeur est volontairement indéfini grâce/à cause du "=0"),

alors que

class JusteVirtuelle
{
    public:
        virtual ~JusteVirtuelle() {}
};

est virtuelle (le destructeur est toujours une méthode virtuelle ici) mais ENTIÈREMENT DÉFINIE (j'ai fourni un code par défaut pour toutes les méthodes virtuelles) donc impure !

D'ailleurs, pour finir de te convaincre qu'il y a une réelle différence entre abstrait pur et abstrait impur, je t'invite à essayer le main suivant :

int main()
{
    JusteVirtuelle v; // parfaitement valide
    Pure p; // non valide, il n'existe de pas de code pour
                  // au moins une des méthode (le destructeur, en
                  // l'occurence), donc on ne peut pas créer un
                  // objet instance de la classe Pure
    return 0;
}

Compile avec -Wall -Wextra et tu verras. :-)

« Et par rapport a ça, non en effet niveau expressivité ça apporte pas forcément quelque chose, mais au niveau sécurité et séparation pour moi c'est clair que c'est important. » :d) tu confonds clairement la compilation séparée et le polymorphisme toi. Ou pire, tu utilises des classes abstraites absolument pas pour ce à quoi elles servent. :peur:

« Par exemple comment tu veux faire faire une implémentation par quelqu'un sans classe abstraite? » :d) demande à Linus Torvald comment il a fait pour écrire son Linux en C. :-)))
Plus concrètement, heureusement qu'on peut définir des interfaces + implantations sans classes abstraites, parce que beaucoup de langages n'ont pas ce concept.
Et encore une fois, la programmation modulaire (séparer/masquer du code à l'aide d'interfaces+implantations) n'a pas grand chose à voir avec les classes abstraites. :(

Pseudo supprimé
Pseudo supprimé 25 février 2012 à 00:55:53

Pure :d) Est une classe abstraite, donc virtuelle pure

JusteVirtuelle :d) Est juste une classe virtuelle, oui.

Mais une classe ABSTRAITE PURE, ça n'a pas de sens, c'est un pléonasme.

Je vois pas comment je pourrais mieux expliquer. Abstraite impure ça n'existe pas.

http://fr.wikipedia.org/wiki/Classe_abstraite
Extrait: n C++, une classe est abstraite si elle contient au moins une méthode déclarée virtuelle pure, c'est-à-dire commençant par virtual et terminée par = 0.

Exactement ce que je dis, et j'avais pas regardé avant.

ArgentComptant
ArgentComptant
Niveau 5
25 février 2012 à 01:02:21

"Pure :d) Est une classe abstraite, donc virtuelle pure "

Je confirme : http://cpp.developpez.comm/cours/cpp/?page=page_10#LX-O

"JusteVirtuelle :d) Est juste une classe virtuelle, oui. "

Non, une classe virtuelle pour moi c'est ça : http://cpp.developpez.comm/cours/cpp/?page=page_10#LX-F

Après je peux me tromper.

Pseudo supprimé
Pseudo supprimé 25 février 2012 à 01:12:14

Mmmmh je sais même pas si on peut faire class A : virtual class B en C++ tu vois, j'ai jamais vu ça :(

Pseudo supprimé
Pseudo supprimé 25 février 2012 à 01:13:28

Ah ok lol, c'est du cpp, j'ai rizen dit :hap:

chris_27
chris_27
Niveau 10
25 février 2012 à 01:19:09

Foudre: pour moi, abstrait et virtuelle c'est synonyme ici. À partir du moment où tu peux "écraser" le code (ou l'absence de code) de la classe dont tu hérites, il y a une sorte d'abstraction qui apparaît (pour être plus précis, il s'agit d'une source de polymorphisme). Après, je suis d'accord avec toi que dans ce contexte, le "pur" suffit. Mais on peut difficilement parler de "classe pure" dans un contexte un peu plus vague. :-)))

ArgentComptant: le coup de l'héritage en diamant, c'est encore autre chose. Pour le coup, je ne fais de l'héritage multiple en C++ que sur des choses complètement disjointes, et du coup je ne maîtrise pas trop l' "héritage virtuel" (ça se dit comme ça en français ?). Cela dit, une définition de "classe virtuelle" qui dépend du contexte et non du contenu même de la classe, ça me paraît peu sain. :(
Je préfère nettement le "il existe une méthode virtuelle (pure ou impure) implique classe virtuelle" comme définition. :oui:

chris_27
chris_27
Niveau 10
25 février 2012 à 01:20:35

Foudre: oui, ArgentComptant parle d'autre chose que ce à quoi je pensais à l'origine (il rejoint néanmoins un peu ce que disait godrik).

Pseudo supprimé
Pseudo supprimé 25 février 2012 à 01:28:01

Oui alors j 'ai jamais vu ça "Class A : virtual class B" ça correspond a quoi en fait par rapport a des méthodes virtuelles classiques? Ca veut juste dire que toutes les methodes de B sont virtuelles?

Sinon chris, perso je parlais pas de fonctionnalité mais bien de lexique et de manière d'appeler les choses.

Abstraite pure, même si ça peut eventuellement avoir un sens ça ne se dit pas en français. On dit abstraite pour une classe et virtuelle pure pour une méthode.

Apres classe virtuelle si c'est l'exemple de Argent je suis un peu curieux de savoir ce que c'est.

Pseudo supprimé
Pseudo supprimé 25 février 2012 à 01:30:34

Ah ok héritage en diamant, c'est marrant en fait ça, je vois pas trop a quoi ça sert mais bon. Lol.

Pseudo supprimé
Pseudo supprimé 25 février 2012 à 01:38:25

Ah ok, après m'être renseigné, donc, Argent a raison, c'est très fourbe, on ne peut dire d'une classe qu'elle est virtuelle que quand elle est déclarée comme ci dessus. Sinon on dit: "Elle comporte une méthode virtuelle".

Et encore, j'ai l'impression qu'une classe est seulement virtuelle "par rapport" à une autre, car on peut très bien avoir:

Class B : virtual Class A
Class C: Class A

Dans ce cas, A est virtuelle ou pas? :hap:

Pseudo supprimé
Pseudo supprimé 25 février 2012 à 01:40:14

Quadruple post mais en fait oui Chris tu dis comme moi par rapport aux classes virtuelles lol.

chris_27
chris_27
Niveau 10
25 février 2012 à 01:50:12

Dans le cas du diamant, le virtual apparait au moment de l'héritage, pas au moment de la déclaration d'une classe. Du coup, en toute logique, c'est l'héritage qui doit être qualifié de virtuel, et non la classe dont on hérite (et puis bon, dans l'exemple de ArgentComptant, la classe A est on ne peut plus bateau quoi).
Après, j'ai peur qu'on puisse se battre longtemps sur du vocabulaire, précisément pour le point que j'ai amené dans l'autre thread : les différences sont surtout d'ordre syntaxique et n'apporte rien de fondamental au langage (bon, pour l' "héritage virtuel", on évite les doublons en bas du diamant quand même).

Sinon, pour virtuel on est d'accord. C'est sur "abstrait" qu'on différait. Je suis plus sur "abstrait = virtuel = on peut écraser une méthode et obtenir ainsi du polymorphisme" alors que tu es plus "abstrait = pur". :-)))

Pseudo supprimé
Pseudo supprimé 25 février 2012 à 02:16:38

Oui voilà...Après je sais pas si ya vraiment un nom officiel, en tout cas les devs experts chez moi, quand ils parlent de classe abstraite, ça veut dire "classe qui comporte au moins une méthode virtuelle pure"

Pseudo supprimé
Pseudo supprimé 25 février 2012 à 02:18:17

Bon en tout cas je vais m'incruster un peu plus souvent sur ce forum moi :hap: c'est intéressant :hap:

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment