我试图完全理解C ++标准[class.access]部分的多个段落中定义的类成员访问规则。它们非常复杂,因此我需要简短但准确而详尽的摘要。
我编写了此程序来在多种情况下测试受保护成员的可访问性(因为很难获得受保护成员的规则:]
#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;
}
我得出这个结论:
public-可以在同一类,派生类和外部类中访问函数和变量
protected
private
Note
:派生类继承基类的所有方法,但以下情况除外。现在对于朋友说明符,这来自cpp参考here在这里,您将获得示例以及有关如何使用它的详细说明。
您还可以在其中找到有关标准库的大量信息的示例,还可以查看将来标准中的内容以及编译器支持的功能。