Код действителен в соответствии со Стандартом - см. Это Стандартное правило, которое я не имел в виду, когда отвечал раньше
Член m доступен, когда назван в классе N, если
- [...] или
- существует базовый класс B из N, который доступен в исходной точке, и m доступен, когда
назван в классе B.
Это полностью относится к вашему коду, и, следовательно, доступ действителен ... Похоже, что основная цель этого правила состоит в том, чтобы позволить объявлениям друзей базы применяться к унаследованным элементам, но это также относится и к этому случаю.
(Не обращайте внимания на части, в которых говорится, что код недействителен. Он действителен, как описано выше. Эта часть является старой версией моего ответа, хранящейся здесь в качестве справочной информации)
Нет, этот код недействителен. Вот почему эквивалентные «декларации доступа» называются таким образом (хотя они не рекомендуются)
struct F : A {
public:
A::y;
private:
A::z;
};
Они называются "декларации доступа", точно , потому что они могут изменить доступ ... В вашем примере класс именования F
и z
, поскольку член F
является приватным потому что объявление-использование действительно изменило уровень доступа имени z
.