Eu estou tentando compreender plenamente as regras de acesso de membro de classe definido em vários parágrafos do [class.access] seção do padrão C ++. Eles são bastante complexas, portanto, eu preciso de uma curta mas resumo preciso e exaustivo .
Eu escrevi este programa para testar a acessibilidade de membros protegidos em várias situações (desde as regras para membros protegidos são o mais difícil de obter):
#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;
}
Cheguei a esta conclusão:
- membros públicos de uma classe são acessíveis a quaisquer entidades;
- membros privados de uma classe são acessíveis apenas a membros e amigos da mesma classe;
- membros protegidos de uma classe são acessíveis apenas a membros e amigos da classe, para membros e amigos de classes derivadas dessa classe se os membros protegidos são herdadas das classes derivadas ou classes base das classes derivadas, e aos membros da classes base dessa classe se os membros protegidas são estáticos .
É o meu resumo preciso e exaustivo?