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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top