Вы можете «продвигать» спецификацию доступа посредством наследования, можете ли вы когда-либо «опускать» спецификацию доступа? - PullRequest
1 голос
/ 29 июля 2011

Под «продвижением» я подразумеваю сделать доступ более ограничительным, а под «понижением» я подразумеваю сделать менее ограничительным.

Например, когда class B получено из class A с использованием : protected или : private тогда публичные члены A будут повышены до защищенных и частных соответственно.

Может ли когда-нибудь class C когда-либо войти и получить себя из class B, в то же время демобилизуя унаследованных членов классаВернуться к своим оригинальным спецификациям доступа?

Ответы [ 4 ]

7 голосов
/ 29 июля 2011

Если вы используете protected деривацию, класс C действительно может предоставить доступ к защищенным элементам, создав соответствующую оболочку:

class A {
public:
  void F();
};

class B : protected A { };

class C : public B {
public:
  using B::F;
};

Это также можно сделать для работы с элементами данных:

class A {
public:
  int n;
};

class B : protected A { };

class C : public B {
public:
  using B::n;
  C() : n(this->B::n) { }
};

С наследованием private это невозможно напрямую, потому что C не может сам получить доступ к членам в A. Однако, если B получен из A с использованием наследования private virtual, это снова становится возможным :

class A {
public:
  void F();
};

class B : private virtual A { };

class C : public B, public virtual A { };

int main() {
  C x;
  x.F();
  return 0;
}

Это работает, потому что с наследованием virtual, C может быть получен непосредственно из того же экземпляра из A как B, но с другим спецификатором доступа.

3 голосов
/ 29 июля 2011

Объявление using может предоставить доступ к открытым или защищенным членам защищенных базовых классов:

struct A {int x;};
struct B : protected A {};

struct C : B
{
    using A::x;  // publicly accessible
}

Очевидно, что частные члены и базовые классы недоступны для C, поэтому вы не можете уменьшить их ограничения.

0 голосов
/ 29 июля 2011

Нет . Потому что, когда class C выводит class B; он не знает об исходных спецификаторах доступа class A. Он просто учитывает спецификаторы доступа в class B.

0 голосов
/ 29 июля 2011

Конечно, нет, какой смысл иметь наследование private или protected, если я могу просто создать еще один производный этот класс, который снимает ограничения доступа промежуточного класса и делает все public?

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