2016/8/18 16:49
关键概念:类的用户(primer 5th page 545)
一个类,我们可以认为有三类用户:
- 普通用户,也就是类的对象,这些对象只能给访问public成员
- 类的实现者,也就是基类的函数(及友元),他们能够访问类的所有部分
- 类的派生类,派生类和普通用户类似,也是类的用户,但是它还能够访问类的protected成员
类的访问说明符 public、private、protected
类的访问说明符,是类的用户的访问控制,也就是:
- 普通用户只能给访问public成员
- 类的派生类能够访问public和protected成员
- 类本身和友元能够访问所有成员
派生访问说明符 public、private、protected
派生访问说明符不会控制派生类对直接基类的访问权限,只是影响派生类的用户的访问权限:
比如下面,A2函数f1中,始终不能访问a,始终能够访问b,c,不管13行中是以怎么的方式继承A1.
但是,对于A2的用户来说(A2 的对象,A2 的派生类),13行的派生访问说明符就会产生效果。
具体效果是,
- 如果是private继承,那么A1中所有成员在A2中相当于用类的访问说明符private修饰一样,对于A2的用户都不可访问。
- 如果是public继承,那么A1中的成员在A2中保在A1中的..
- 如果是protected继承,…
见下面。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22class A1
{
protected:
int a;private:
int b;public:
int c;
};class A2 : public A1
{
int b;
void f1()
{
a; // 错误
b;
c;
}
};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//多重继承
class B1
{
public:
int a;
};class B2 : private B1
{
public:
int b;
void f1()
{
a;
}
};class B3 : private B2
{
int c;
void f1()
{
a; // 不能被访问了
b;
c;
}
};怎么改变派生访问说明符的控制:使用using
primer 5th page 545
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//多重继承
class B1
{
public:
int a;
};class B2 : private B1
{
public:
int b;
void f1()
{
a;
}
using B1::a;
};class B3 : private B2
{
int c;
void f1()
{
a;
b;
c;
}
};来自网上的总结
基本
private, public, protected 访问标号的访问范围。
private:只能由1.该类中的函数、2.其友元函数访问。
不能被任何其他访问,该类的对象也不能访问。
protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。
但不能被该类的对象访问。
public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,
也可以由4.该类的对象访问。
注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。
类的继承后方法属性变化。
private 属性不能够被继承。
使用private继承,父类的protected和public属性在子类中变为private;
使用protected继承,父类的protected和public属性在子类中变为protected;
使用public继承,父类中的protected和public属性不发生改变;
public
protected
private
共有继承
public
protected
不可见
私有继承
private
private
不可见
保护继承
protected
protected
不可见
注意点1
访问控制是基于类的,不是基于对象的。
这说明什么?
见 这里 :
http://blog.codingnow.com/2010/03/cpp_protected.html
友元
友元函数及友元类可以访问类的私有成员
1
2
3
4
5
6
7
8
9
10
11// 友元
class A
{
friendvoid myf(A *pa);
int a;
};void myf(A *pa)
{
cout << pa->a << endl;
}在派生类中的友元,只能给通过派生类访问基类的受保护成员
三种继承的意义(public/private/protected)
public继承表示——A是一种(is a)B
private继承表示——A根据B实现(A is implemented in terms of B)
protected继承没有什么物理上的意义
vczh:
private继承表示“A is a B”这个隐藏的属性只有A自己能依赖
protecte表示"A is a B"这个隐藏的属性只有A和自己的子类能依赖
来自 <https://www.zhihu.com/question/49046664>
类的继承和访问控制
最新推荐文章于 2024-03-30 11:33:37 发布