OVH Cloud OVH Cloud

Terminologie: classe abstraite

53 réponses
Avatar
Luc Hermitte
Salut.

Je me posais une question au sujet de ce qu'était reconnu comme une
classe abstraite.

Jusqu'à présent, ma définition a toujours été : "une classe non
instanciable".

Dans la norme, la formulation ressemble à peu près à : "Une classe
abstraite est non instanciable (1). Une classe est abstraite si elle
dispose d'au moins une fonction membre qui soit virtuelle pure (fmqsvp)
(2)".

Là arrive le pinaillage. J'ai croisé des définitions qui disaient qu'une
"classe abstraite est une classe qui a au moins une fmqsvp" (3).
Si on s'en tient à la formulation officielle, la seconde partie est une
condition suffisante mais non nécessaire. Ce qui ne suffit pas à déduire
(3).

Si on définit une classe dont les constructeurs sont tous au moins
protégés (et dépourvue de créateurs amis ou assimilés, voir les fonctions
statiques des singletons), on arrive aussi à définir une classe qui ne
soit pas instanciable...
... à un détail près: elle peut quand même être instanciée dans les
fonctions membres des descendants de la classe.

struct Abs {
protected:
Abs() {}
};

struct fils : Abs {
void f() { Abs a; }
};


Est-ce ce détail qui nous donne la condition nécessaire (je ne vois pas
d'autres façon d'avoir des classes non instanciables et utilisables (tout
privé)) qui manquait pour justifier la formulation (3) ?

Personnellement, je n'aime pas cette formulation (3) car elle tient du
détail d'implémentation. C'est peut-être bien la seule façon de définir
des classes abstraites en C++, mais ce n'est pas ça qui est réellement
important AHMA.

Bref, j'aurais aimé avoir l'avis d'autres pinailleurs sur la question. Et
eventuellement savoir si j'avais manqué un point.


--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>

3 réponses

2 3 4 5 6
Avatar
Aurélien REGAT-BARREL
Virtuel pure veut dire qui doit etre supplantee et qui peut ne pas
etre implementee (sauf pour le destructeur qui sera toujours existant,
qu'il soit virtuel pur ou non).


Ah bon. Ben merci bien.

--
Aurélien REGAT-BARREL

Avatar
Loïc Joly
Jean-Marc Bourguet wrote:

"Aurélien REGAT-BARREL" writes:


(je chipote mais bon, c'est le bon endroit pout il me semble ;-)



J'ai bien fais de chipoter, je me coucherai moins bête ce soir :-)


Je repete: avoir un membre virtuel pur n'empeche en rien de lui donner
une implementation.

class foo {
foo() { bar = new char[10]; }
~foo() = 0;
};

foo::~foo() {
delete bar;
}

Quel boulot doit faire le programmeur de la classe derivee de foo?


Eh bien celui d'ouvrir un bouquin de C++ et de comprendre ce que tu
viens d'écrire. Comment cela est-il donc bien possible d'avoir une
fonction virtuelle pure (dont je croyais que ça voulait dire "non
implémenté") qui est bien réelle ?



Virtuel pure veut dire qui doit etre supplantee et qui peut ne pas
etre implementee (sauf pour le destructeur qui sera toujours existant,
qu'il soit virtuel pur ou non).


Virtuelle pure veut dire doit être supplantée. Elle peut ou non être
implémentée que la fonction soit un destructeur ou non. S'il s'agit d'un
destructeur, il sera appelé automatiquement, comme tout destructeur.
S'il s'agit d'une autre fonction, elle sera appelée uniquement de
manière totalmeent qualifiée, comme toutes les autres fonctions
supplantées (10.4.2).

--
Loïc




Avatar
Jean-Marc Bourguet
Loïc Joly writes:

Virtuelle pure veut dire doit être supplantée. Elle peut ou non être
implémentée que la fonction soit un destructeur ou non.


Un destructeur virtuel pur doit etre defini (12.4/7) et comme tu l'as
declare, il ne le sera pas implicitement.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

2 3 4 5 6