Резюмируя доступ к члену класса правил в C ++

голоса
0

Я пытаюсь , чтобы полностью понять правила доступа к членам класса , определенные в нескольких пунктах [class.access] раздел стандарта C ++. Они довольно сложны поэтому мне нужен короткий , но точный и исчерпывающий обзор .

Я написал эту программу, чтобы проверить доступность защищенных членов в различных ситуациях (так как правила для защищенных членов являются труднее получить):

#include <iostream>

class B {
  protected:
    int i = 1;
    static int const I = 1;
};

class X: public B {
  protected:
    int j = 2;
    static int const J = 2;
  public:
    void f();
    friend void g();
};

class D: public X {
  protected:
    int k = 3;
    static int const K = 3;
};

void X::f() {
  B b;
  X x;
  D d;
  //std::cout << b.i;  // error: 'i' is a protected member of 'B'
  std::cout << b.I;
  std::cout << x.i;
  std::cout << x.I;
  std::cout << x.j;
  std::cout << x.J;
  std::cout << d.i;
  std::cout << d.I;
  std::cout << d.j;
  std::cout << d.J;
  //std::cout << d.k;  // error: 'k' is a protected member of 'D'
  //std::cout << d.K;  // error: 'K' is a protected member of 'D'
}

void g() {
  B b;
  X x;
  D d;
  //std::cout << b.i;  // error: 'i' is a protected member of 'B'
  //std::cout << b.I;  // error: 'I' is a protected member of 'B'
  std::cout << x.i;
  std::cout << x.I;
  std::cout << x.j;
  std::cout << x.J;
  std::cout << d.i;
  std::cout << d.I;
  std::cout << d.j;
  std::cout << d.J;
  //std::cout << d.k;  // error: 'k' is a protected member of 'D'
  //std::cout << d.K;  // error: 'K' is a protected member of 'D'
}

int main() {
  X x;
  x.f();
  g();
  return 0;
}

Я пришел к такому выводу:

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

Является ли мое резюме точным и исчерпывающим?

Задан 14/02/2020 в 00:02
источник пользователем
На других языках...                            


1 ответов

голоса
0

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

  • общественные - функции и переменные могут быть доступны в том же классе, производный класс и внешний класс

  • защищенные - функции и переменные могут быть доступны в том же классе, и производный класс

  • частные - функции и переменные могут обращаться в одном классе.

Когда дело доходит до наследования у вас есть несколько типов, а также:

  • общественности - общественность и защищенные члены наследуются с их соответствующим типом доступа
  • защищенный - открытые члены наследуются как защищенные и защищенные члены будут держать их тип доступа.
  • частные - государственные и частные члены будут унаследованы

Примечание : Производные классы наследуют все методы базового класса со следующим исключением.

  • Конструкторы, деструкторы и копирование Конструкторы базового класса

  • Перегруженные операторы базового класса.

  • Друг функции базового класса.

Теперь , как для друга спецификатора, это из ссылки CPP здесь Здесь вы будете иметь примеры и подробные разъяснения о том , как использовать его.

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

Ответил 14/02/2020 в 05:22
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more