Herança múltipla torna membro privado acessível
-
21-12-2019 - |
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
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