Sto cercando di comprendere appieno le regole di accesso membro di classe definito in più paragrafi del [class.access] sezione dello standard C ++. Sono abbastanza complessa quindi ho bisogno di una breve ma sintesi accurata ed esauriente .
Ho scritto questo programma per testare l'accessibilità dei membri protetti in diverse situazioni (dal momento che le regole per i membri protette sono il più difficile da ottenere):
#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;
}
Sono venuto a questa conclusione:
- membri pubblici di una classe sono accessibili a tutte le entità;
- membri privati di una classe sono accessibili solo ai soci e agli amici di quella classe;
- membri protetti di una classe sono accessibili solo ai soci e agli amici di quella classe, ai membri e agli amici di classi derivate di quella classe se i membri protetti sono ereditati dalle classi derivate o classi di base delle classi derivate, e ai membri delle classi base di quella classe se i membri protetti sono statici .
È la mia sintesi accurata ed esauriente?