Je sais qu'il y a peu de différences entre struct
et class
en C++. Je comprends également la (les) raison (s) pour peu de différence (s). Comme celui-ci,Justification de la différence dans le spécificateur d'accès "par défaut" pour une classe de base
- Les membres de struct sont public par défaut ; les membres de la classe sont privé par défaut. La raison pour laquelle les membres de struct sont public par défaut, est de rendre
C++-struct
compatible avecC-struct
. Et la raison pour laquelle membre de la classe sont privé par défaut, est d'introduire le concept de encapsulation de données (c'est-à-dire l'application de principes orientés objet/techniques/etc).
Ce que je ne comprends pas cela, citant la norme 11.2 $/2 [class.access.base]
En l'absence d'un accès spécificateur pour une classe de base, est supposée publique lorsque la classe dérivée est déclarée struct et privée est supposée lorsque la classe est déclarée classe.
Quelle est la justification de cette torsion et anti-uniformité? Pourquoi cette différence est-elle nécessaire?
l'exemple de la norme,
class B { };
class D1 : private B { };
class D2 : public B { };
class D3 : B { }; //B private by default
struct D4 : public B { };
struct D5 : private B { };
struct D6 : B { }; //B public by default
class D7 : protected B { };
struct D8 : protected B { };
Ici B est une base publique de D2, D4, et D6, une base privée de D1, D3 et D5, et une base protégée de D7 et D8.
EDIT
Certains d'entre vous pourraient dire, cette différence est logique compte tenu de l'accès par défaut pour struct et la classe étant différente (la différence donnée dans le point ci-dessus). Mais je pense, inherited-struct
tout à fait incompatible avec C-struct
(qui ne supporte pas l'héritage), peu importe comment vous le dérivez. J'ai peut-être tort cependant. C'est pourquoi je cherche de bonnes explications, éventuellement avec des exemples! :-)
@Charles: le point n'est pas que c'est "Simple et facile à retenir", comme vous l'avez dit. Je cherche une explication pour cette différence, pas ce que tu as dit. – Nawaz
@Nawaz: Quelle différence? Si l'héritage 'class' avait été' public' par défaut et l'accès 'private' à un membre, alors vous auriez une différence qui nécessitait une justification. Comme la règle est le choix le plus simple, il n'y a pas vraiment besoin de justification supplémentaire. –
+1, aimant ce raisonnement :) Notez aussi qu'il donnera de la consistance au nom de classe injecté. Si l'héritage ne serait pas public, alors donné 'struct A: SomeStruct {};' faire 'A :: SomeStruct' serait inaccessible en dehors de la classe. –