La première n'est pas autorisée car elle conduit à des définitions ambiguës. Dans la 2ème, bien que vous ayez à la fois une variable entière publique et une variable entière a
, vous avez caché A :: a dans votre classe B. Le compilateur sait implicitement ce que vous voulez car il existe un moyen d'accéder explicitement à une variable cachée. Je pense aussi que cela se résume à nommer mangaling: les spécificateurs de stockage ne font pas partie du nom réel. Je pourrais avoir tort sur ce point cependant. La façon la plus simple d'illustrer pourquoi un est autorisé et pourquoi l'autre ne l'est pas est de regarder comment le compilateur compilerait une fonction membre qui utilise chaque variable.
l'intérieur de votre classe b:
class b {
int a;
public:
int a;
void myMethod()
{
a = 10; //what a should the compiler use? Ambiguous, so the compiler sez BZZT.
}
}
Pour le 2ème exemple:
class A
{
public:
int a;
}
class B: public A
{
private:
int a;
void someMethod()
{
a = 10; //implied that you are using B::a (which may be a programmer error)
}
}
@Neil: Vous voulez dire que le 2ème déclare une classe A? – Alan
@Alan Oui - J'étais tellement perplexe devant la question que je me suis un peu perdue :-) –
Pourquoi cela a-t-il un downvote? C'est une question raisonnable, je me souviens de me demander la même chose tout en apprenant des cours en C++ ... – Cam