Подтвердить что ты не робот

Селективное наследование С++

Не могли бы вы объяснить, почему следующий код компилируется и работает нормально (проверено на gcc-4.3.4). Я думал, что выборочное наследование не может ослабить или даже усилить доступ к членам/методам. Разве это не нарушает правила инкапсуляции?

#include <iostream>

class A {
protected:
    void foo() { std::cout << "foo" << std::endl;  }
};

class B : private A {
public:
    using A::foo;   //foo() becomes public?!
};

int main() {
    B b;
    b.foo();
    return 0;
}
4b9b3361

Ответ 1

С точки зрения языка, нет ничего плохого в этом (будь то хороший дизайн - другое дело).

Любой класс может выбрать для раскрытия более широкой аудитории вещи, к которым у него есть доступ.

В принципе, ваш пример ничем не отличается от:

class B : private A {
public:
    void bar() { foo(); }
};

за исключением того, что здесь foo() отображается через прокси.

То, что вы не можете сделать, - это обратное: открытый класс не может ограничивать доступ к вещам, доступным через базовый класс.