part4.(two)派生类成员函数和其它函数访问基类成员时的权限(访问控制表)

一、关于访问控制符(3种访问属性)

  1、类中的访问控制符:①默认值为私有,可声明为公有或保护;

            ②私有(private)成员的访问属性:只能供本类的成员函数和友员函数访问,不准其它函数访问;

            ③公有(public)成员的访问属性:可供任何函数访问;

            ④保护(protected)成员的访问属性:除与私有成员相同外,还允许派生类成员函数访问,但不准其它函数访问。

  2、结构体(struct)中的访问控制符:默认为公有,可设置为私有或者保护

  3、联合结构体(union):只能为公有

即:本类(直接基类)的成员函数有权访问访问控制表内的所有成员。派生类的成员函数只能访问具有publicprotected属性的成员。而其他函数只能访问具有public属性的成员。

 

 二、3种继承方式

配合3种访问属性 构成的 访问关系映射表 如下

 注意:1、派生类对象的栈区存储内容与继承方式和访问权限无关。

    2、一个类的访问控制表内只包含该类及其基类(直接的和间接的)中符合访问权限的数据成员和成员函数而不是全部成员,也不包括虚指针。

而一个类对象的栈区存储内容则包括该类及其所有基类(直接的和间接的)的全部非静态数据成员(无论能否访问),也包括虚指针,但不包括任何静态数据成员和成员函数,它与继承方式及访问权限无关。

    3、某些场合下,当派生类中所继承的数据为私有时,可能希望个别数据改变为具有公有性质。此时可利用以下语句:

      public:

      using base::a;

 

将派生类中某些继承数据的私有性质改变为公有性质
 1 // der_priv_1.cpp
 2 // When derivation is private so that public or protected member in base class
 3 // becomes privately accessible in derived class, it can become publicly accessible
 4 // by "using base::a;"
 5 
 6 #include <iostream.h>
 7 
 8 class A
 9 {
10 public:
11       A(int i) {    a=i;}
12 protected:    //or public:
13       int a;
14 };
15 
16 class B: A    //private derivation
17 {
18 public:
19       B(int a):A(a) { }
20       using A::a;        //将A::a的私有性质改变为公有性质
21 };
22 
23 void main()
24 {
25      B  obj(5);
26      cout<<obj.a<<endl;
27 }

 

posted on 2013-05-06 21:33  イケメンおっさん_汪汪  阅读(403)  评论(0编辑  收藏  举报

导航