2010-12-13 1 views
1

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 avec C-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! :-)

Répondre

7

Je ne sais pas pourquoi vous pensez que c'est une torsion, vous avez une cohérence avec les sous-objets membres et les sous-objets de la classe de base. Ils sont tous deux publics pour les classes déclarées avec struct et privés pour les classes déclarées avec class. Simple et facile à retenir.

+0

@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

+0

@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. –

+0

+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. –

1

Cela n'a-t-il pas de sens étant donné que l'accès par défaut pour struct et class est différent? (comme dans votre première puce)

Si vous héritez d'une structure (qui est par défaut publique) sans spécifier de modificateur d'accès) alors sans spécifier un modificateur d'accès, vous indiquez un héritage privé.

Quelque chose m'a manqué dans votre question?

+0

J'ai mis à jour mon message. Vérifie s'il te plaît. :-) – Nawaz

+0

Je pense, j'ai compris maintenant. Merci pour le post. +1 de moi! – Nawaz

Questions connexes