Многократное наследование делает частный участник доступным

StackOverflow https://stackoverflow.com//questions/23024091

Вопрос

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, что позволило бы иметь такой доступ, поскольку путь большинства доступа определяет, какие защиты применяются.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top