一、关于访问控制符(3种访问属性)
1、类中的访问控制符:①默认值为私有,可声明为公有或保护;
②私有(private)成员的访问属性:只能供本类的成员函数和友员函数访问,不准其它函数访问;
③公有(public)成员的访问属性:可供任何函数访问;
④保护(protected)成员的访问属性:除与私有成员相同外,还允许派生类成员函数访问,但不准其它函数访问。
2、结构体(struct)中的访问控制符:默认为公有,可设置为私有或者保护
3、联合结构体(union):只能为公有
即:本类(直接基类)的成员函数有权访问访问控制表内的所有成员。派生类的成员函数只能访问具有public和protected属性的成员。而其他函数只能访问具有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 }