访问控制和继承方式
这部分内容比较繁琐,但很简单,在此条理地介绍一下。
1.首先,介绍:对类中成员的访问方式
先举一个例子,了解水平访问和垂直访问
#include "iostream.h" using namespace std; class A { private: int ma; public: void afun(){} }; class B:public A { private: int mb; public: void bfun(){} }; void B::bfun() { afun(); //垂直访<span style="font-size: 12px;">问,子类B中的成</span>员函数访问从A继承的afun()函数 } void main() { A aobj; aobj.afun(); //水平访问,外部函数(.函数)访问实例中的afun函数 B bobj; bobj.afun(); //水平访问,访问bobj从A中继承的afun函数 bobj.bfun(); //水平访问,访问bobj的bfun函数 }
访问包括两种方式:水平访问和垂直访问
(1)水平访问,是指对类中成员的实例化使用;
(2)垂直访问,指在使用继承时,派生类中成员函数对基类成员的访问。
2.访问控制和继承方式
访问控制被用于数据的封装和保护。可以从两个角度实现对类中数据的访问控制:设置类成员的访问属性和设置继承方式。
类成员的访问属性有三种,即public、private和protected。
公有成员允许外部函数访问;私有成员不允许外部函数访问,只允许本类的成员函数访问;保护成员不允许外部函数访问,但允许本类和其子类的成员函数访问。
(1)继承方式对水平访问的影响(这是我们最常用见的)
如下表:
继承方式 |
基类访问权限 |
派生类访问权限 |
对继承成员的水平访问(.函数) |
public |
public
|
public
|
yes
|
private |
public
|
private
|
no
|
protected |
public
|
protected
|
no
|
说明:若piblic>protected>private;那么派生类的访问权限=min(基类访问权限,继承方式),然后根据派生类中成员的访问属性确定水平访问权限。
(2)继承方式对垂直访问的影响(垂直方向上如A派生B,B派生C)
如下表:
说明:1、继承方式只是改变了继承成员的访问权限,对父子类的垂直访问没有影响;
2、只要父类中元素是public或protected,子类均可垂直访问。
(A<-B)继承方式 |
A中访问权限 |
B中访问权限 |
B中函数对继承成员的访问 |
C中函数对继承成员的访问(B<-C的继承方式任意) |
public |
public
|
public
|
yes
|
yes
|
private |
public
|
private
|
yes
|
no
|
protected |
public
|
protected
|
yes
|
yes
|
总结:上表中第4列和第2列有关;第5列和第3列有关。如前所述,第3列是由1、2列得到的。