Question

class A {
    public:
            int a;
};

class B: private A {
};

class C: public A {
};

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

Ceci compile même si B héritée en privé A. Si je supprimez le héritage de C, le compilateur dit A est inaccessible, comme je m'attendais.Il y a donc l'héritage de C déroutant mon compilateur?

compilateur est GCC 4.4.7

Était-ce utile?

La solution

ressemble à un bogue de compilateur authentique, car la norme ne permet pas un tel accès dans

11.2 Accessibilité des classes de base et des membres de la classe de base

À la recherche de preuves en dehors de la norme elle-même, WhozCraig a déjà élevé que Clang ne permet pas un tel accès.

Recherche de schémas similaires qui pourraient être confondus dans GCC, il existe un dioint héritage avec la classe de base virtuelle A, qui aurait permis un tel accès, car le chemin de la plupart des accès détermine quelles protections s'appliquent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top