Pergunta

class A {
    public:
            int a;
};

class B: private A {
};

class C: public A {
};

class D: public B, public C {
        D() {
                B::a = 0;
        }
};

Isso é compilado mesmo que B herde A em particular.Se eu remover a herança de C de D, o compilador dirá que a está inacessível, como eu esperava.Então a herança de C está confundindo meu compilador?

O compilador é gcc 4.4.7

Foi útil?

Solução

Parece um bug genuíno do compilador, já que o padrão não permite tal acesso em

11.2 Acessibilidade de classes base e membros da classe base

Procurando evidências fora do próprio padrão, WhozCraig já trouxe à tona que o clang não permite tal acesso.

Procurando por padrões semelhantes que possam ser confundidos no gcc, existe a herança diamon com a classe base virtual A, que teria permitido tal acesso, já que o caminho da maioria dos acessos determina quais proteções se aplicam.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top