L'ereditarietà multipla rende il membro privato accessibile
-
21-12-2019 - |
Domanda
class A {
public:
int a;
};
class B: private A {
};
class C: public A {
};
class D: public B, public C {
D() {
B::a = 0;
}
};
.
Questo compila anche anche se B inebriamente A. Se rimuovo l'eredità di D, il compilatore dice che è inaccessibile, come se mi aspetterei.Così è l'ereditarietà di C confusione del mio compilatore?
Compilatore è GCC 4.4.7
Soluzione
Sembra un vero bug del compilatore, poiché lo standard non consente un tale accesso in
.11.2 Accessibilità delle classi di base e dei membri della classe base
Alla ricerca di prove al di fuori dello standard stesso, chi ha già allevato il serbatoio che Clang non consente un tale accesso.
Alla ricerca di modelli simili che potrebbero essere confusi in GCC, c'è la diamon-ereditarietà con la classe di base virtuale A, che avrebbe consentito tale accesso, poiché il percorso della maggior parte dell'accesso determina quali protezioni si applicano.