Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

initialisation des variables membres par défaut

73 réponses
Avatar
Richard Delorme
// ---------8<----------------------------
#include <iostream>

class A {
private:
int x;

public:
A() {};
~A() {};
void print() {
std::cout << x << std::endl;
}
};


int main() {
A t;
int y;


t.print();
std::cout << y << std::endl;

return 0;
}
// ---------8<----------------------------

Dans l'exemple ci-dessus, ni x, membre de la classe A, ni la variable
locale y ne sont initialisées.
gcc détecte le cas de la variable locale :
attention : ‘y’ may be used uninitialized in this function
mais reste silencieux sur la variable membre.
Valgrind signale les deux cas (de manière guère compréhensible d'ailleurs).

Personnellement je pensais comme Valgrind que la variable x devait être
initialisé explicitement dans le constructeur, par exemple en écrivant :
A() : x() {};
à la place du constructeur ci-dessus.

Néanmoins la lecture de blogs sur internet me laisse dans le doute. Par
exemple ici :
http://discuss.joelonsoftware.com/default.asp?joel.3.489111.50

On lit tout et son contraire. Qu'en est il en pratique ? (et en théorie
aussi d'ailleurs).

--
Richard

10 réponses

4 5 6 7 8
Avatar
Wykaaa
Marc Espie a écrit :
In article ,
Michael Doubez wrote:
Dans le cas de l'échequier je ne suis pas sûr que la modélisation des
pièces soit un point central. Une recherche se fera plutôt sur l'état
d'un plateau, les pièces existeront en instance unique pour générer
les états de plateau suivant.



Normalement, on commence par realiser une conception logiquement fiable, et
ensuite on se pose des questions eventuelles d'efficacite.



Je suis entièrement d'accord mais, en l'occurrence, et il n'y a pas que
les échecs dans ce cas, l'impératif de performance peut faire que ta
conception logicielle fiable doive être revue entièrement et déboucher
sur une toute autre conception (avec même certains objets différents).

J'ai vu le cas, en conception, avec une application transactionnelle.

Sur ce type d'exemple, je pense directement au pattern flyweight, par exemple.



Oui, pourquoi pas.
Avatar
Stan
On 28 jan, 17:03, Wykaaa wrote:

Ce n'est pas la question ici car tu n'en a pas forcément besoin, mais s i
tu veux passer par une AbstractFactory pour créer les jours, libre à toi



La question a un rapport avec :

En approche objet, je n'utilise jamais des enums. Je passe toujours par
l'héritage.



Or quand dans une AbstractFactory , pour créer tes objets tu n'as
pas 10000 possibilités ;
tu peux utiliser un tableau associatif, ou bien un selecteur de type
if/else,
ou encore un switch + enum.
Pour des construction reposant sur un int, ce dernier choix est tout à
fait
acceptable.

et je te renvoie, dans ce cas, à la littérature abondante qui explici te
la chose...



Je ne relève même pas :-|

--
-Stan
Avatar
Stan
On 28 jan, 17:03, Wykaaa wrote:

Ce n'est pas la question ici car tu n'en a pas forcément besoin, mais s i
tu veux passer par une AbstractFactory pour créer les jours, libre à toi
et je te renvoie, dans ce cas, à la littérature abondante qui explici te
la chose...



La question a un rapport avec :

En approche objet, je n'utilise jamais des enums. Je passe toujours par
l'héritage.



Or dans une AbstractFactory , pour créer tes objets tu n'as
pas 10000 possibilités ;
tu peux utiliser un tableau associatif, ou bien un selecteur
de type if/else, ou encore un switch + enum.
Pour des construction reposant sur un int, ce dernier choix
est tout à fait acceptable.

et je te renvoie, dans ce cas, à la littérature abondante qui explici te
la chose...



Je ne relève même pas :-|

--
-Stan
Avatar
Wykaaa
Stan a écrit :
On 28 jan, 17:03, Wykaaa wrote:

Ce n'est pas la question ici car tu n'en a pas forcément besoin, mais si
tu veux passer par une AbstractFactory pour créer les jours, libre à toi
et je te renvoie, dans ce cas, à la littérature abondante qui explicite
la chose...



La question a un rapport avec :

En approche objet, je n'utilise jamais des enums. Je passe toujours par
l'héritage.



Or dans une AbstractFactory , pour créer tes objets tu n'as
pas 10000 possibilités ;
tu peux utiliser un tableau associatif, ou bien un selecteur
de type if/else, ou encore un switch + enum.
Pour des construction reposant sur un int, ce dernier choix
est tout à fait acceptable.



Je n'avais pas bien compris ta question. Elle ne semble pas liée à mon
exemple mais plutôt à comment on fait pour créer un objet de la bonne
sous-classe dans le pattern Factory. C'est ça ?

J'éviterai enum+swith le plus possible. mais si la construction repose
sur un int, je suis d'accord avec toi. On ne va pas, non plus,
compliquer à loisir. Je reste pragmatique malgré les apparences.
Mais là, il s'agit du choix de construction du "bon objet" et non pas de
traitement à proprement parlé sur des objets déjà créés.

et je te renvoie, dans ce cas, à la littérature abondante qui explicite
la chose...



Je ne relève même pas :-|



Désolé si cette dernière phrase t'es apparue un rien méprisante. Ce
n'était pas du tout mon intention.
Avatar
James Kanze
On 27 Jan, 22:26, Wykaaa wrote:
Stan a écrit :



> On 27 jan, 20:45, Wykaaa wrote:



>> En approche objet, je n'utilise jamais des enums. Je passe
>> toujours par l'héritage. Un enum, c'est une classe
>> abstraite et il y a autant de sous-classes que de valeurs
>> dans l'enum.



> Faut pas faire dans le dogmatisme. Il faut utiliser les
> enums pour ce quoi elle sont utiles; effectivement, si c'est
> pour faire un mécanisme de sélection de type, le
> polymorphisme est plus adapté. Mais dans ce cas, tu aurais
> en dire autant des switches.



La chasse aux switches est à la programmation objet ce que la
chasse aux gotos est à la programmation structurée.



Pas tout à fait : si c'est vrai qu'on en a beaucoup moins besoin
des switches quand on a le polymorphisme, il y a encore des cas,
par exemple, un switch sur un caractère lu sur l'interface
utilisateur. (Une fois, juste pour voir, j'ai essayé d'écrire
un bout de code sans les switch. Ça ne tient pas la route quand
on a affaire à des entrées en provenance de l'exterieur. Ni, par
exemple, pour des choses du genre code d'erreur.)

Les enums conduisent inévitablement à des switches, c'est pour
cela que je ne les utilise pas.



Tiens, là, tu m'apprends quelques choses. Parce que j'ai bien
des enum dans mon code, mais pas de switch sur l'enum. (À
quelques exceptions près.)

> J'ai vu beaucoup de projets où l'héritage était utilisé à
> outrance, où tout était modélisé en classes :
> ces programmes étaient difficiles à comprendre et à maintenir.



Ce qui est difficile à maintenir ce sont les switches
dépendant d'énums auxquels on va ajouter des valeurs (il va
falloir faire tous les tests de non régression) alors qu'avec
l'héritage on ajoutera les sous-classes correspondant aux
valeurs ajoutées *sans toucher au code existant*.



Et alors. Il y a certainement des utilisations néfastes des
enums. Mais on peut faire du difficile à maintenir avec
n'importe quoi -- comme disait l'autre, il y a aussi des cas où
le polymorphisme rend le programme plus difficile à comprendre.

On n'aura à tester que le code qui correspond aux nouvelles
valeurs.



Pas du tout. Jamais une modification sans faire passer le jeu
complet des tests de regression.

Où sont les difficultés de maintenance avec du code purement objet ?
Quant à la compréhension du code purement objet, il apparaît diffic ile
pour 2 raisons essentiellement :
1) Soit les gens qui le lisent ne sont pas suffisamment formés ou
habitués à l'objet
2) Soit le code est mal écrit (en fait c'est plutôt souvent parce que la
conception objet est mal foutue).



Tout à fait. Et comme « mal écrit », on entend aussi les cas o ù
la technologie ne convenait pas.

À cet égard, l'objet n'est pas différent que n'importe quoi
d'autre (y compris les enum). Bien utilisé, à bonne échéance, il
facilite le travail. Mal utilisé, c'est tout à fait le
contraire.

[...]
Enfin, pour finir et enfoncer le clou, dans une approche
objet, tout, absolument tout, doit être modélisé en classes et
le polymorphisme doit être utilisé à tous les niveaux des
hiérarchies de classes.



Par définition, n'est-ce pas ? C'est pour ça qu'il faut bien
dire que l'objet n'est pas un silver bullet ; qu'il ne convient
pas pour tout. (Je fais pas mal de calcul numérique en ce
moment ; heureusement que je ne suis pas obligé à me servir
d'une classe polymorique pour les doubles.)

Faire autrement, dans des langages objets comme C++ ou Java,
c'est vouloir utiliser ces langages pour autre chose que ce
pourquoi ils ont été inventés.



C'est un peu le problème de Java, je te l'accorde. Mais C++ a
été inventé pour supporter de multiples paradigmes. Y essayer de
forcer tout à être un objet, c'est ne pas avoir compris le
langage, et ne pas l'utiliser comme son concepteur voulait.
(Certains de nos jours prétendent même que l'héritage en C++,
c'est du passée, et qu'il ne faut plus s'en servir.)

Maintenant on peut aimer jouer à se faire peur en n'écoutant
pas les leçons de l'histoire de l'informatique



La première leçon de l'histoire de l'informatique, c'est qu'il
n'y a pas de technologie miracle -- pas de silver bullet, comme
on dit en américain. Insister qu'une solution apporte la réponse
à tout problème, c'est de ne pas prêter attention aux leçons de
l'histoire.

mais quand on est dans l'industrie, ça devient un problème
d'éthique : on ne fait pas joujou avec le code quand il s'agit
de logiciels pour l'avionique ou les centrales nucléaires. En
plus,il y a des mécanismes de certification draconiens.



Qui, la plupart du temps, interdisent le polymorphisme.

--
James Kanze
Avatar
James Kanze
On 27 Jan, 23:09, Wykaaa wrote:
James Kanze a écrit :



> On Jan 27, 7:45 pm, Wykaaa wrote:
>> Marc Espie a écrit :
> [...]
>>> Les variables non initialisees (et leur copain, les switch
>>> sur un champ type) sont des symptomes de design faits par
>>> des gens qui n'ont pas encore bien integre la conception
>>> objet (ou qui, pour de basses questions de temps, n'ont pas
>>> termine leur design).



>> En approche objet, je n'utilise jamais des enums. Je passe
>> toujours par l'héritage.



> Étant donné que les deux sert à des buts complètement
> différents, je ne vois pas le rapport. J'en utilise les deux.



Non, il n'ont pas des buts différents.



Je regrette, mais ils n'ont aucun rapport immédiat. Il y a bien
queques cas où on pourrait se servir de l'un ou de l'autre, mais
ils sont assez rare. En général, au moins dans un langage comme
le C++ qui supporte les deux, c'est l'un ou l'autre qui
s'impose, selon le cas, et l'utilisation de l'autre donne un
programme nettement inférieur.

>> Un enum, c'est une classe abstraite et il y a autant de
>> sous-classes que de valeurs dans l'enum.



> Sauf qu'un enum, ça n'a rien à voir avec une classe,
> abstraite ou non. (Pour commencer, un enum, c'est une
> valeur, et une classe abstraite suppose en général un
> comportement et une identité. Tout à fait l'opposer d'un
> enum.)



Tu veux dire qu'un enum est une variable scalaire quand tu dis
"valeur"?



Exactement. C'est une valeur, au sens absolut du terme.

Et un enum, ça a un comportement puisqu'on le gère avec des
switches...



Si tu veux faire des bêtises, effectivement, il n'y a rien dans
le langage qui te l'empêche. Mais des switch sur des enum, c'est
quand même des exceptions. Tout au plus, on fait un if sur une
valeur spéciale (genre OK), ou on se sert comme indice dans un
tableau (par exemple, pour récupérer le message à afficher).

Mais l'enum sert surtout à transporter l'information entre des
couches de programmation qui ne se connaissent pas, d'une façon
simple et efficace. Il transporte l'information ; il n'a pas de
comportement.

1) enum



enum Jour {LUNDI, MARDI, MERCREDI, ...};
Jour j = ...;



void travailler(Jour leJour)
{
switch(j)
{
case LUNDI : //faire ceci
case MARDI : //faire cela
case MERCREDI : //faire autre chose
...
}



travailler(j);
N'est-ce pas une fonction qui décrit un comportement de l'enum ?



2) polymorphisme



class Jour
{
public:
virtual void travailler()=0;
// éventuellement d'autres méthodes
}



class Lundi
{
public:
virtual void travailler() {//faire ceci}
};
class Mardi
{
public:
virtual void travailler() {//faire cela}
};
class Mercredi
{
public:
virtual void travailler() {//faire autre chose}
};



Jour j = new ...;



j.travailler();



Quel est le plus évolutif ?



Le premier, de loin. C'est un exemple type où l'enum convient,
et la classe polymorphique non. Parce que le code qui convertit
la date système en jour ne doit rien savoir de ton travailler,
même pas qu'il existe.

Ensuite, si tu as des dépendences dans le comportement, on
pourrait imaginer une hièrarchie qui les encapsule. Quelque
chose du genre :

class Activité
{
public:
virtual ~Activité();
virtual void travailler() = 0;
};

class ActivitéDeJourDeLaSemaine : public Activité ...
class ActivitéDeSamedi : public Activité ...
class ActivitéDeDimanche : public Activité ...

ActivitéFactory* dispatch[] =
{
&activitéDeJourDeLaSemaineFactory,
&activitéDeJourDeLaSemaineFactory,
&activitéDeJourDeLaSemaineFactory,
&activitéDeJourDeLaSemaineFactory,
&activitéDeJourDeLaSemaineFactory,
&activitéDeSamediFactory,
&activitéDeDimancheFactory
};

std::auto_ptr< Activité >
getActivité( JourDeLaSemaine jour )
{
return dispatch[ jour ]->createInstance();
}

Évidemment, le jour qu'on change le nombre de jours dans la
semaine, il va falloir retoucher le tableau. Mais c'est une
risque acceptable, à mon avis. Et en fait, ça serait
probablement toujours moins de travail que ta solution, parce
qu'on peut supposer que le jour qu'on ajoute, c'est un jour de
semaine, et donc, la classe nécessaire est déjà écrite.

Dans l'ensemble, je crois que tu as bien mal choisi ton exemple.

--
James Kanze
Avatar
James Kanze
On 28 Jan, 11:53, Wykaaa wrote:
Stan a écrit :
> On 28 jan, 00:09, Wykaaa wrote:



> [...]



>> Quel est le plus évolutif ?
>> Où est ta différence valeur/comportement ?



> Même avec une conception objet du logiciel efficace,
> à un moment donné, il te faudra bien implémenter
> *un peu* d'algorithmie.



> Et là, tu peux dire ce que tu veux, pour être efficace (en
> rapidité, lisibilité et maintenance), les enum, switch ou
> if/else sont tout adaptés. Lorsque c'est bien, conçu, ce ne
> pose aucun pb ( à l'echelle de l'algo évidemment).



Mon exemple ne te parle-t-il pas ?



Et comment. Il montre bien le problème de ne pas utiliser un
enum. Utiliser des classes distinctes, comme tu as voulu faire,
signifie que les fonctions qui déterminent le jour doivent
connaître ton application. Il va radicalement à l'encontre de
l'encapsulation. Tandis que l'enum...

(Et en passant, est-ce que tu penses réelement qu'il faut que le
code prenne en compte la possibilité que le nombre de jours dans
la semaine change ? Il y a quand même des limites à la
généricité.)

Les switches sont une horreur pour la maintenance et les évolutions
quand on fait de l'objet alors que le polymorphisme rend les
"aiguillages" automatiques quand on ajoute des sous-classes.



Le polymorphisme est une horreur pour la maintenance quand
l'information décisive est calculée autre part que dans le code
applicatif.

--
James Kanze
Avatar
Fabien LE LEZ
On Thu, 28 Jan 2010 11:57:32 -0800 (PST), James Kanze
:

(Certains de nos jours prétendent même que l'héritage en C++,
c'est du passée, et qu'il ne faut plus s'en servir.)



Gloups... Quel est l'argument ?

Je peux comprendre quelqu'un qui dit qu'il ne faut plus utiliser C++
(et Dieu sait qu'ils sont nombreux !), ou encore qu'il vaut mieux
préférer le polymorphisme statique au polymorphisme dynamique, mais
interdire carrément l'héritage... O_O
Avatar
James Kanze
On 28 Jan, 13:22, Michael Doubez wrote:
On 28 jan, 00:09, Wykaaa wrote:
> James Kanze a écrit :



> > On Jan 27, 7:45 pm, Wykaaa wrote:
> >> Marc Espie a écrit :
> > [...]
> >>> Les variables non initialisees (et leur copain, les switch
> >>> sur un champ type) sont des symptomes de design faits par
> >>> des gens qui n'ont pas encore bien integre la conception
> >>> objet (ou qui, pour de basses questions de temps, n'ont pas
> >>> termine leur design).



> >> En approche objet, je n'utilise jamais des enums. Je passe
> >> toujours par l'héritage.



> > Étant donné que les deux sert à des buts complètement
> > différents, je ne vois pas le rapport. J'en utilise les deux.



> Non, il n'ont pas des buts différents.



Formellement, un enum est un type distinct constitué d'un
ensemble de constantes.



De même que int. Sauf que int, normalement, a un peu plus de
constantes que mes enum:-).

C'est l'utilisation que tu en fais qui a un but similaire.



La plupart de temps, on s'en sert plutôt comme un int qui
contiendrait un numéro de série que comme un int qui
contiendrait une quantité. N'empêche que...

[...]
> Tu veux dire qu'un enum est une variable scalaire quand tu
> dis "valeur"?



Qui a la propriété interressant qu'à la déclaration, la valeur d' un
enum est la valeur de l'enum précédent + 1.



J'avais oublié cet aspect-là, mais c'est vrai que je préfère

Weekday operator++( Weekday& day )
{
day = static_cast< Weekday >( (day + 1) % 7 );
return day;
}

à
class Weekday
{
// ...
virtual std::auto_ptr< Weekday > next() const = 0 ;
};

class Monday : public Weekday
{
// ...
virtual std::auto_ptr< Weekday > next() const
{
return std::auto_ptr< Weekday >( new Tuesday );
}
};

Je trouve le premier beaucoup plus facile à écrire et à
maintenir. Même si on change le nombre de jours dans la semaine.

[...]
> C'est pareil pour les pièces de l'échiquier et Move devient une m éthode
> virtuelle de Pièce.
> La promotion c'est la destruction de la pièce, objet de la promotion, et
> la création, avec la même position (que je préfère à l'identi fiant
> "coordonnées") de la pièce qui la remplace.
> Position est d'ailleurs elle-même une classe.



Dans le cas de l'échequier je ne suis pas sûr que la modélisation d es
pièces soit un point central. Une recherche se fera plutôt sur l'ét at
d'un plateau, les pièces existeront en instance unique pour générer
les états de plateau suivant.



Dans le cas des échecs, c'est difficile à dire. Je pourrais bien
imaginer une classe de base abstraite pour les pièces, avec que
sais-je, une fonction virtuelle pûre du genre :
std::vector< Position > legalTargets( Position from ) const = 0;
Bien que des cas comme un pion qui prend en passant pourrait poser
des problèmes, ainsi que roquer. Mais pas forcement des
problèmes insurmontable. C'est une solution à considérer. (Mais
pas la seule valable non plus.)

--
James Kanze
Avatar
Wykaaa
James Kanze a écrit :
On 27 Jan, 22:26, Wykaaa wrote:
Stan a écrit :



On 27 jan, 20:45, Wykaaa wrote:





En approche objet, je n'utilise jamais des enums. Je passe
toujours par l'héritage. Un enum, c'est une classe
abstraite et il y a autant de sous-classes que de valeurs
dans l'enum.







Faut pas faire dans le dogmatisme. Il faut utiliser les
enums pour ce quoi elle sont utiles; effectivement, si c'est
pour faire un mécanisme de sélection de type, le
polymorphisme est plus adapté. Mais dans ce cas, tu aurais
en dire autant des switches.





La chasse aux switches est à la programmation objet ce que la
chasse aux gotos est à la programmation structurée.



Pas tout à fait : si c'est vrai qu'on en a beaucoup moins besoin
des switches quand on a le polymorphisme, il y a encore des cas,
par exemple, un switch sur un caractère lu sur l'interface
utilisateur. (Une fois, juste pour voir, j'ai essayé d'écrire
un bout de code sans les switch. Ça ne tient pas la route quand
on a affaire à des entrées en provenance de l'exterieur. Ni, par
exemple, pour des choses du genre code d'erreur.)



Pour les 2 cas que tu cites,je suis d'accord. Dans un analyseur lexical
par exemple, les switches sont inévitables puisqu'on ne connait pas le
type de la donnée d'entrée. Pour les codes d'erreur, il est préférable
d'utiliser les mécanismes d'exception quand on peut mais ça peut être
pénalisant pour les performances dans le cas où l'algorithme impose une
programmation par exception comme pour un mécanisme de gestion des
entrées/sorties dans un noyau de système d'exploitation.

Les enums conduisent inévitablement à des switches, c'est pour
cela que je ne les utilise pas.



Tiens, là, tu m'apprends quelques choses. Parce que j'ai bien
des enum dans mon code, mais pas de switch sur l'enum. (À
quelques exceptions près.)



Ca veut dire que tu ne les utilises pas comme des ensembles de valeur à
traiter alors ?

J'ai vu beaucoup de projets où l'héritage était utilisé à
outrance, où tout était modélisé en classes :
ces programmes étaient difficiles à comprendre et à maintenir.





Ce qui est difficile à maintenir ce sont les switches
dépendant d'énums auxquels on va ajouter des valeurs (il va
falloir faire tous les tests de non régression) alors qu'avec
l'héritage on ajoutera les sous-classes correspondant aux
valeurs ajoutées *sans toucher au code existant*.



Et alors. Il y a certainement des utilisations néfastes des
enums. Mais on peut faire du difficile à maintenir avec
n'importe quoi -- comme disait l'autre, il y a aussi des cas où
le polymorphisme rend le programme plus difficile à comprendre.



Dans ce cas, c'est peut-être qu'il a été mal employé.

On n'aura à tester que le code qui correspond aux nouvelles
valeurs.



Pas du tout. Jamais une modification sans faire passer le jeu
complet des tests de regression.



Je ne suis pas d'accord. Il y a des cas où on peut se dispenser de
passer la totalité des tests de non régression en toute sécurité.
Heureusement, dans un compilateur par exemple, qu'on ne va pas passer
tous les tests de non régression à la moindre modification du code...

Où sont les difficultés de maintenance avec du code purement objet ?
Quant à la compréhension du code purement objet, il apparaît difficile
pour 2 raisons essentiellement :
1) Soit les gens qui le lisent ne sont pas suffisamment formés ou
habitués à l'objet
2) Soit le code est mal écrit (en fait c'est plutôt souvent parce que la
conception objet est mal foutue).



Tout à fait. Et comme « mal écrit », on entend aussi les cas où
la technologie ne convenait pas.



Il y a effectivement des applications pour lesquelles l'objet ne
convient pas.

À cet égard, l'objet n'est pas différent que n'importe quoi
d'autre (y compris les enum). Bien utilisé, à bonne échéance, il
facilite le travail. Mal utilisé, c'est tout à fait le
contraire.



Oui, tout à fait.

[...]
Enfin, pour finir et enfoncer le clou, dans une approche
objet, tout, absolument tout, doit être modélisé en classes et
le polymorphisme doit être utilisé à tous les niveaux des
hiérarchies de classes.



Par définition, n'est-ce pas ? C'est pour ça qu'il faut bien
dire que l'objet n'est pas un silver bullet ; qu'il ne convient
pas pour tout. (Je fais pas mal de calcul numérique en ce
moment ; heureusement que je ne suis pas obligé à me servir
d'une classe polymorique pour les doubles.)



Ca dépend du contexte. J'ai connu une application qui faisait des
calculs de déformation de pièces en fonction de contraintes
tangentielles pour fabriquer des abaques d'usinage. les polynômes à
manipuler pouvaient avoir des coefficients de toute nature (rationnels,
réels et même des matrices). On a utilisé le polymorphisme pour les
coefficients et cela a rendu le code d'une simplicité biblique alors que
le problème était très complexe.

Faire autrement, dans des langages objets comme C++ ou Java,
c'est vouloir utiliser ces langages pour autre chose que ce
pourquoi ils ont été inventés.



C'est un peu le problème de Java, je te l'accorde. Mais C++ a
été inventé pour supporter de multiples paradigmes. Y essayer de
forcer tout à être un objet, c'est ne pas avoir compris le
langage, et ne pas l'utiliser comme son concepteur voulait.
(Certains de nos jours prétendent même que l'héritage en C++,
c'est du passée, et qu'il ne faut plus s'en servir.)



Je pense que c'est parce que, aujourd'hui, on utilise le C++ là où on
devrait continuer à utiliser C.

Maintenant on peut aimer jouer à se faire peur en n'écoutant
pas les leçons de l'histoire de l'informatique



La première leçon de l'histoire de l'informatique, c'est qu'il
n'y a pas de technologie miracle -- pas de silver bullet, comme
on dit en américain. Insister qu'une solution apporte la réponse
à tout problème, c'est de ne pas prêter attention aux leçons de
l'histoire.



Tout à fait d'accord. Ma remarque concernait seulement le contexte
particulier de la discussion.

mais quand on est dans l'industrie, ça devient un problème
d'éthique : on ne fait pas joujou avec le code quand il s'agit
de logiciels pour l'avionique ou les centrales nucléaires. En
plus,il y a des mécanismes de certification draconiens.



Qui, la plupart du temps, interdisent le polymorphisme.




Et bien justement, pas toujours et on peut faire du code absolument sûr
en utilisant intensivement le polymorphisme même s'il est vrai que ce
n'est pas dans les parties temps réel "dur".
4 5 6 7 8