访问控制和继承方式

这部分内容比较繁琐,但很简单,在此条理地介绍一下。
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
protected
private

public
protected
private

yes
no
no

private

public
protected
private

private
private
private

no
no
no

protected

public
protected
private

protected
protected
private

no
no
no

说明:若piblic>protected>private;那么派生类的访问权限=min(基类访问权限,继承方式),然后根据派生类中成员的访问属性确定水平访问权限。
(2)继承方式对垂直访问的影响(垂直方向上如A派生B,B派生C)
如下表:
说明:1、继承方式只是改变了继承成员的访问权限,对父子类的垂直访问没有影响;
        2、只要父类中元素是public或protected,子类均可垂直访问。

(A<-B)继承方式

A中访问权限

B中访问权限

B中函数对继承成员的访问

C中函数对继承成员的访问(B<-C的继承方式任意)

public

public
protected
private

public
protected
private

yes
yes
no

yes
yes
no

private

public
protected
private

private
private
private

yes
yes
no

no
no
no

protected

public
protected
private

protected
protected
private

yes
yes
no

yes
yes
no

总结:上表中第4列和第2列有关;第5列和第3列有关。如前所述,第3列是由1、2列得到的。

原文地址:https://www.cnblogs.com/houkai/p/3564284.html