class_hierarchy

public/private/protected

是否可以在非类成员函数访问

public: 可以
protected: 不可以
private: 不可以

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class F {
private:
int a;
protected:
int b;
public:
int c;
};

int main() {
F f;
int d = f.a // error
int d = f.b // error
int d = f.c // ok
}

是否可以在子类访问

public: 可以
protected: 可以
private: 不可以

在子类中的访问类型

取决于继承时候的access-specifier, 会影响父类的public和protected成员
note: 这决定非成员函数能不能访问这些成员,而不影响在类内部是否能访问这些成员

public: 作为子类的public成员
protected: 作为子类的protected成员
private: 作为子类的private成员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class F {
private:
int a;
protected:
int b;
public:
int c;
};

class F1: private F {
// 相当于
// private:
// int b;
// int c;
};

int main() {
F1 f;
std::cout << f.c; //error 因为F1是使用private方式继承F,所以c在子类中是private的
}

参考

derived_class