Доступ к элементу в иерархии наследования - C ++ - PullRequest
2 голосов
/ 18 сентября 2010
struct A {
protected:
  int y;
public:
  int z;
};

struct F : A {
public:
  using A::y;
private:
  using A::z;
};

int main() {
  F obj_F;
  obj_F.y = 9;
  obj_F.z = 10;
}

Источник: http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=/com.ibm.vacpp7a.doc/language/ref/clrc14cplr135.htm

В приведенном выше коде obj_F.z = 10; - разрешено. Объяснение: Доступ к члену z по-прежнему открыт. Объявление частного использования с использованием A :: z не влияет на доступ к z.

Может кто-нибудь сказать мне, если z, который объявлен как приватный, доступен снаружи, тогда что означает этот приват? Что это делает?

Спасибо

-Saiyasodharan

Ответы [ 2 ]

3 голосов
/ 18 сентября 2010

Код действителен в соответствии со Стандартом - см. Это Стандартное правило, которое я не имел в виду, когда отвечал раньше

Член m доступен, когда назван в классе N, если

  • [...] или
  • существует базовый класс B из N, который доступен в исходной точке, и m доступен, когда назван в классе B.

Это полностью относится к вашему коду, и, следовательно, доступ действителен ... Похоже, что основная цель этого правила состоит в том, чтобы позволить объявлениям друзей базы применяться к унаследованным элементам, но это также относится и к этому случаю.


(Не обращайте внимания на части, в которых говорится, что код недействителен. Он действителен, как описано выше. Эта часть является старой версией моего ответа, хранящейся здесь в качестве справочной информации)

Нет, этот код недействителен. Вот почему эквивалентные «декларации доступа» называются таким образом (хотя они не рекомендуются)

struct F : A {
public:
  A::y;
private:
  A::z;
};

Они называются "декларации доступа", точно , потому что они могут изменить доступ ... В вашем примере класс именования F и z, поскольку член F является приватным потому что объявление-использование действительно изменило уровень доступа имени z.

0 голосов
/ 18 сентября 2010

F наследует А в частном порядке.Таким образом, вы не можете получить доступ ни к одному из открытых членов A, если вы используете F вне определения F.Поскольку F не определяет членов, F в основном бесполезен.

Если F наследует A публично (то есть:)

struct F : public A {};

, то теперь вы можете использовать открытый член A.так что вы можете написать obj_F.z

Если у вас есть переменная z, которая является общедоступной в a и частной в F, т.е.Это не то, что вам нужно.

также, как сказал Андре Хольцнер, ваши операторы использования здесь бесполезны.

Как правило, вы не можете использовать любой объектный язык программирования, ограничить область действия членаунаследованный подкласс.Либо определение класса не будет компилироваться, не подчиняться или создавать другого члена с таким же именем.Это потому, что ваш F не совместим с кодом, который имеет дело с A или его подклассом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...