Я пытаюсь , чтобы полностью понять правила доступа к членам класса , определенные в нескольких пунктах [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;
}
Я пришел к такому выводу:
- открытые члены одного класса являются доступными для любых лиц;
- частные члены одного класса доступны только для членов и друзей этого класса;
- защищенные члены одного класса доступны только для членов и друзей этого класса, членам и друзьям производных классов этого класса , если защищенные члены унаследованных от производных классов или базовых классов производных классов, а также члены базовых классов из этого класса , если защищенные члены статичные .
Является ли мое резюме точным и исчерпывающим?