C++继承中的成员访问控制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zm1_1zm/article/details/77922091

由基类到派生类的过程中,在派生类里如何访问基类成员,以及派生类对象如何访问基类成员,是根据派生类在从基类派生时是以什么方式进行的派生:public、protect或者private。下面说一下在这三种派生方式下成员函数和成员变量的访问和修改权限。派生类是指直接派生类!

【代码1】

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
29
30
31
32
33
34
35
36
37
38
39
class  Base{
     //其他内容
public :
     int  BaseFunPb(){ return  m_nPb;}
     int  BaseFunPt(){ return  m_nPt;}
     int  BaseFunPr(){ return  m_nPr;}
public :     int  m_nPb;
protected int  m_nPt;
private :    int  m_nPr;
};
class  Cpb: public  Base{
     //其他内容
public :
     int  GetPb(){ return  m_nPb;}
     int  GetPt(){ return  m_nPt;}
     int  GetPr(){ return  m_nPr;}
};
class  Cpt: protected  Base{
     //其他内容
public :
     int  GetPb(){ return  m_nPb;}
     int  GetPt(){ return  m_nPt;}
     int  GetPr(){ return  m_nPr;}
};
class  Cpr: private  Base{
     //其他内容
public :
     int  GetPb(){ return  m_nPb;}
     int  GetPt(){ return  m_nPt;}
     int  GetPr(){ return  m_nPr;}
};
   
int  main()
{
     Cpb objB;
     Cpt objT;
     Cpr objR;
     //其他内容
}

访问分为:类对象访问、类内访问两种;

对于基类继承下来的成员的访问与修改权限如下:

基类成员访问权限(列
public protected private
派生方式(行) 派生类对象 派生类类内 派生类对象
派生类类内
派生类对象
派生类类内
public 可访/可修 权限:public
可访/可修
可访/不可修 权限:protected
可访/不可修
可访/不可修 权限:private
可访/不可修
protected 可访/不可修 权限:protected
可访/可修
可访/不可修 权限:private
可访/可修
可访/不可修 权限:private
不可访/不可修
private 可访/不可修 权限:private
可访/可修
可访/不可修 权限:private
可访/可修
可访/不可修 权限:private
可访/不可修

派生类内不管是 public、protected、private 继承,总是可以访问基类中的public、protected 成员,基类中的 private 成员永远不能在派生类内直接访问,不论通过哪种方式。

派生类对象仅当public派生时,对基类中的public成员有可访问/可修改的权限,其他都为不可访问/不可修改。

用‘B’代表public,用'T‘代表protected,用'R’代表private;BT->T代表基类成员访问权限为B,派生方式为T,派生后成员在派生类内的访问权限为T;‘r'表示可访问,’w'代表可修改,‘-'表示不可访问或不可修改,在第一位表示不可访,在第二位表示不可修;则上表简化为如下:

 

访问权限变更
派生类对象 派生类类内 访问权限变更 派生类对象 派生类类内 访问权限变更
派生类对象 派生类类内
BB->B rw rw TB->T -- r- RB->R -- --
BT->T -- r- TT->R -- r- RT->R -- --
BR->R -- r- TR->R -- r- RR->R -- --

当派生类下面还有派生类时,派生类作为基类,权限更改同上!

猜你喜欢

转载自blog.csdn.net/zm1_1zm/article/details/77922091