Plusieurs héritage rendent membre privé accessible
-
21-12-2019 - |
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
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.