Ответ 1
С точки зрения языка, нет ничего плохого в этом (будь то хороший дизайн - другое дело).
Любой класс может выбрать для раскрытия более широкой аудитории вещи, к которым у него есть доступ.
В принципе, ваш пример ничем не отличается от:
class B : private A {
public:
void bar() { foo(); }
};
за исключением того, что здесь foo()
отображается через прокси.
То, что вы не можете сделать, - это обратное: открытый класс не может ограничивать доступ к вещам, доступным через базовый класс.