您的位置:首页 > 编程语言 > C语言/C++

类的继承和访问控制

2016-08-18 17:29 162 查看
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

22
class 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>
 
 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++