Многократное наследование делает частный участник доступным
-
21-12-2019 - |
Вопрос
class A {
public:
int a;
};
class B: private A {
};
class C: public A {
};
class D: public B, public C {
D() {
B::a = 0;
}
};
.
Это компилирует, даже если B в частном порядке наследует А. Если я удаляю наследование D, компилятор говорит, что является недоступным, как я ожидаю.Так что наследование C сбивает моего компилятора?
компилятор GCC 4.4.7
Решение
выглядит как ошибка подлинного компилятора, так как стандарт не позволяет такого доступа в
11.2 Доступность базовых классов и членов базового класса
Ищете доказательства за пределами самого стандарта, WORZCRAIG уже поднял, что Clang не позволяет такого доступа.
Ищете аналогичные модели, которые могут быть запутаны в GCC, есть диамон-наследование с виртуальным базовым классом A, что позволило бы иметь такой доступ, поскольку путь большинства доступа определяет, какие защиты применяются.
Не связан с StackOverflow