C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制

转自: http://blog.sina.com.cn/s/blog_b35e31b90101b6y7.html

很多同学到现在仍然对访问权限不是很清楚,或者比较模糊,有的同学记了又忘,忘了又记,所以今天想要借这篇文章给大家做一些总结,然后提供一个比较简便的方法去记C++中的访问权限。


       众所周知,C++通过public,protected,private三个关键字来实现类成员(包括成员变量和成员方法)控制访问权限,下面为了便于大家记忆,我给访问权限的大小定义: public > protected > private   > no access , 基于这个定义 给出我总结的一个小诀窍,就是: 升不升,遇降则降,遇平则平,私有除外 。访问权限的插图如下:
C++ <wbr>公有继承、保护继承和私有继承中类成员的访问权限的控制
为了方便大家理解,给出解释:
       1、当成员变量在父类中的访问权限为private时,不管采用哪种继承方式,在子类中的访问权限都变为no access,这叫 私有除外
       2、当成员变量在父类中的访问权限为protected时,继承方式为public时,子类中的访问权限为protected,这叫 遇升不升 ,继承方式为protected时,子类中的访问权限仍为protected,这叫 遇平则平 ,继承方式为private时,子类中的访问方式变为private,这叫 遇降则降
       3、当成员变量在父类中的访问权限为public时,继承方式为public时,子类中的访问权限为public, 遇平则平 继承方式为protected时,子类中的访问权限为protected, 遇降则降 了吧,当继承方式为private时,子类中的访问权限为private,又 遇降则降 了吧。

       通过上面的总结我们还发现,遇降则降, 降幅总是个遇到的那个相同 ,比如public遇到了private时,访问权限就变为private,遇到protected时,就变为protected。
       明白了上面表格中的规律后,我们就可以很方便的运用这种访问权限机制来编写程序了,在此之前我们还要了解的是,一个类成员的访问权限确定后,又对应了两种情况,一种是在类内,一种是在类外。总结一下:
在类内部:只要不是no access,那么我们都可以访问该成员。也就是说类内部的访问权限比较松,凡是可访问的权限都能访问,不论是public、protected还是private。
在类外部:只要不是public,那么我们都不可以访问该成员。
也就是说在类的外部访问权限比较严格,只要访问权限不是public的成员,在类外部都不能访问它。

明白了吗?
为了让大家再深刻的理解上面的总结,我还为大家设计了下面的小小的测试程序:希望用心的同学自己动手亲自测试一下:

class Animal       //父类
{
public:
           void eat(){
                       cout<<"animal eat"<<endl;
           }
protected:
           void sleep(){
                       cout<<"animal sleep"<<endl;
           }
private:
           void breathe(){
                       cout<<"animal breathe"<<endl;
           }
};

class Fish:public Animal       //子类
{
public:
           void test(){
                       eat();             //此时eat()的访问权限为public,在类内部能够访问
                       sleep();         //此时sleep()的访问权限为protected,在类内部能够访问
                       breathe();     //此时breathe()的访问权限为no access,在类内部不能够访问
           }
};

int main(void){
           Fish f;

           f.eat();                   //此时eat()的访问权限为public,在类外部能够访问
           f.sleep();              //此时sleep()的访问权限为protected,在类外部不能够访问
           f.breathe()             //此时breathe()的访问权限为no access,在类外部不能够访问
}

上面的代码肯定编译出错,希望大家把继承方式分别更改为protected和private都测试一下,这样你就什么都明白了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值