三种访问权限
我们知道C++中的类,有三种访问权限(也称作访问控制),它们分别是public、protected、private。要理解它们其实也很容易,看下面了一个例子。
父类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
class Person { public : Person( const string& name, int age) : m_name(name), m_age(age) { } void ShowInfo() { cout << "姓名:" << m_name << endl; cout << "年龄:" << m_age << endl; } protected : string m_name; //姓名 private : int m_age; //年龄 }; class Person { public : Person( const string& name, int age) : m_name(name), m_age(age) { } void ShowInfo() { cout << "姓名:" << m_name << endl; cout << "年龄:" << m_age << endl; } protected : string m_name; //姓名 private : int m_age; //年龄 }; |
子类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
class Teacher : public Person { public : Teacher( const string& name, int age, const string& title) : Person(name, age), m_title(title) { } void ShowTeacherInfo() { ShowInfo(); //正确,public属性子类可见 cout << "姓名:" << m_name << endl; //正确,protected属性子类可见 cout << "年龄:" << m_age << endl; //错误,private属性子类不可见 cout << "职称:" << m_title << endl; //正确,本类中可见自己的所有成员 } private : string m_title; //职称 }; class Teacher : public Person { public : Teacher( const string& name, int age, const string& title) : Person(name, age), m_title(title) { } void ShowTeacherInfo() { ShowInfo(); //正确,public属性子类可见 cout << "姓名:" << m_name << endl; //正确,protected属性子类可见 cout << "年龄:" << m_age << endl; //错误,private属性子类不可见 cout << "职称:" << m_title << endl; //正确,本类中可见自己的所有成员 } private : string m_title; //职称 }; |
调用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
void test() { Person person( "张三" , 22); person.ShowInfo(); //public属性,对外部可见 cout << person.m_name << endl; //protected属性,对外部不可见 cout << person.m_age << endl; //private属性,对外部不可见 } void test() { Person person( "张三" , 22); person.ShowInfo(); //public属性,对外部可见 cout << person.m_name << endl; //protected属性,对外部不可见 cout << person.m_age << endl; //private属性,对外部不可见 } |
总结
我们对C++类三种方式控制权限总结如下,这与Java中的三种对应的访问权限是一样的。
qq%e6%88%aa%e5%9b%be20161104113813
三种继承方式
C++中继承的方式还有多种,也分别都用public、protected、private表示。这与Java不一样,Java只有继承的概念,默认是public继承的。
1. 三种继承方式不影响子类对父类的访问权限,子类对父类只看父类的访问控制权。
如下面三种继承方式都能访问父类中的public和protected成员。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
class Teacher : /*public*/ /*protected*/ private Person { public : Teacher( const string& name, int age, const string& title) : Person(name, age), m_title(title) { } void ShowTeacherInfo() { ShowInfo(); //正确,public属性子类可见 cout << "姓名:" << m_name << endl; //正确,protected属性子类可见 //cout << "年龄:" << m_age << endl; //错误,private属性子类不可见 cout << "职称:" << m_title << endl; //正确,本类中可见自己的所有成员 } private : string m_title; //职称 }; class Teacher : /*public*/ /*protected*/ private Person { public : Teacher( const string& name, int age, const string& title) : Person(name, age), m_title(title) { } void ShowTeacherInfo() { ShowInfo(); //正确,public属性子类可见 cout << "姓名:" << m_name << endl; //正确,protected属性子类可见 //cout << "年龄:" << m_age << endl; //错误,private属性子类不可见 cout << "职称:" << m_title << endl; //正确,本类中可见自己的所有成员 } private : string m_title; //职称 }; |
2. 继承方式是为了控制子类(也称派生类)的调用方(也叫用户)对父类(也称基类)的访问权限。
public继承
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
class Teacher : public Person { public : Teacher( const string& name, int age, const string& title) : Person(name, age), m_title(title) { } void ShowTeacherInfo() { ShowInfo(); //正确,public属性子类可见 cout << "职称:" << m_title << endl; //正确,本类中可见自己的所有成员 } private : string m_title; //职称 }; class Teacher : public Person { public : Teacher( const string& name, int age, const string& title) : Person(name, age), m_title(title) { } void ShowTeacherInfo() { ShowInfo(); //正确,public属性子类可见 cout << "职称:" << m_title << endl; //正确,本类中可见自己的所有成员 } private : string m_title; //职称 }; void TestPublic() { Teacher teacher( "李四" , 35, "副教授" ); teacher.ShowInfo(); cout << endl; teacher.ShowTeacherInfo(); } void TestPublic() { Teacher teacher( "李四" , 35, "副教授" ); teacher.ShowInfo(); cout << endl; teacher.ShowTeacherInfo(); } |
结果:
姓名:李四
年龄:35
姓名:李四
年龄:35
职称:副教授
private继承:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
class Teacher : private Person { public : Teacher( const string& name, int age, const string& title) : Person(name, age), m_title(title) { } void ShowTeacherInfo() { ShowInfo(); //正确,public属性子类可见 cout << "职称:" << m_title << endl; //正确,本类中可见自己的所有成员 } private : string m_title; //职称 }; class Teacher : private Person { public : Teacher( const string& name, int age, const string& title) : Person(name, age), m_title(title) { } void ShowTeacherInfo() { ShowInfo(); //正确,public属性子类可见 cout << "职称:" << m_title << endl; //正确,本类中可见自己的所有成员 } private : string m_title; //职称 }; void TestPrivate() { Teacher teacher( "李四" , 35, "副教授" ); teacher.ShowInfo(); //错误,因为Teacher采用了private的继承方式,外部不可访问。 cout << endl; teacher.ShowTeacherInfo(); } void TestPrivate() { Teacher teacher( "李四" , 35, "副教授" ); teacher.ShowInfo(); //错误,因为Teacher采用了private的继承方式,外部不可访问。 cout << endl; teacher.ShowTeacherInfo(); } |
3. public、protected、private三种继承方式,相当于把父类的public访问权限在子类中变成了对应的权限。
如protected继承,把父类中的public成员在本类中变成了protected的访问控制权限;private继承,把父类的public成员和protected成员在本类中变成了private访问控制权。
protected继承:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
class Teacher : protected Person { public : Teacher( const string& name, int age, const string& title) : Person(name, age), m_title(title) { } void ShowTeacherInfo() { ShowInfo(); //正确,public属性子类可见 cout << "职称:" << m_title << endl; //正确,本类中可见自己的所有成员 } private : string m_title; //职称 }; class Teacher : protected Person { public : Teacher( const string& name, int age, const string& title) : Person(name, age), m_title(title) { } void ShowTeacherInfo() { ShowInfo(); //正确,public属性子类可见 cout << "职称:" << m_title << endl; //正确,本类中可见自己的所有成员 } private : string m_title; //职称 }; void TestProtected() { Teacher teacher( "李四" , 35, "副教授" ); teacher.ShowInfo(); //错误,基类Person的ShowInfo此时对Teacher相当于protected的,外部不可以被访问 cout << endl; teacher.ShowTeacherInfo(); } void TestProtected() { Teacher teacher( "李四" , 35, "副教授" ); teacher.ShowInfo(); //错误,基类Person的ShowInfo此时对Teacher相当于protected的,外部不可以被访问 cout << endl; teacher.ShowTeacherInfo(); } class Leader : public Teacher { public : Leader( const string& name, int age, const string& title, string position) : Teacher(name, age, title), m_position(position) { } void ShowLeaderInfo() { ShowInfo(); //基类Person的ShowInfo此时相当于protected的,但子类仍可以访问 ShowTeacherInfo(); //ShowTeacherInfo仍然是public的,可以访问 cout << m_position << endl; } private : string m_position; }; class Leader : public Teacher { public : Leader( const string& name, int age, const string& title, string position) : Teacher(name, age, title), m_position(position) { } void ShowLeaderInfo() { ShowInfo(); //基类Person的ShowInfo此时相当于protected的,但子类仍可以访问 ShowTeacherInfo(); //ShowTeacherInfo仍然是public的,可以访问 cout << m_position << endl; } private : string m_position; }; |
以上所述是小编给大家介绍的C++ 的三种访问权限与三种继承方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!