c++访问控制与继承

  最近,决定认真开始记录自己的学习之路。

  c++类的访问控制有public、private和protected。

  首先要分简单的基类和派生类情况,不是很容易混淆与多级继承时的访问控制。自己原先搞得不清楚,也正是因为没有分开二种情况对待。

  在简单的基类和派生类情况中,其访问控制,可以简单总结:

  public:   1、成员函数   2、类对象   3、友元  4、子类成员函数

  private:  1、成员函数  2、友元  

  protected:  1、成员函数  2、友元   3、子类成员函数

  这些基本都清楚,但是之前比较疑惑的就是继承也有分public、private和protected。其实这是对派生类的子类起作用的,并不影响原先基类和派生类的访问控制。

  大致情况就是:

  假设是public继承,那么原先基类的public、private和protected的访问控制对此基类的派生类的子类不变。

  如果是protected继承,则原先基类的public降为protected,并且也是对基类的派生类的子类起作用。

  而private继承,则把原先基类的public、protected都降为private,并且也是对基类的派生类的子类起作用。

  可以把基类比喻为水龙头,而派生类的public继承为原水龙头大小的管(简称大管)、protected继承为中管、private继承为小管,当水龙头水通过水管是,则把原来水龙头的水缩小了,所以只是对派生类子类起作用的。以下通过代码解释一下:

  class Base  
{  
    public
        int a1;  
        virtual void test() = 0;  
    protected:
        int a2;  
    private:  
        int a3;  
};  
//------------------------------------------------------------------------------  
class Protected_Class_1:protected Base//保护继承  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1在这里被转变为protected  
            a2 = 2;//a2在这里被转变为protected  
            //a3=3;//错误,派生类不能访问基类的私有成员  
        }  
};  
class Protected_Class_2:public Protected_Class_1//以public方式继承Protected_Class_1类  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1在这里仍然保持为a1在这里被转变为protected  
            a2 = 2;//a2在这里仍然保持为a1在这里被转变为protected  
            //a3=3;//错误,由于Base类成员为私有的,即使是上级父类是保护继承,也不能改变Base类成员的控制类型  
        }  
};  
//------------------------------------------------------------------------------  
class Private_Class_1:private Base//私有继承  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1在这里被转变为private  
            a2 = 2;//a2在这里被转变为private  
            //a3=3;//错误,基类私有成员一样是不可访问的  
        }  
};  
class Private_Class_2:public Private_Class_1//以public方式继承Private_Class_1类  
{  
    public:  
        void test()  
        {  
            //a1=1;//错误,由于基类Private_Class_1为私有继承,a1已经转变为private  
            //a2=2;//错误,由于基类Private_Class_1为私有继承,a1已经转变为private  
            //a3=3;//错误,由于Base类成员为私有的,Private_Class_1类也为私有继承  
        }  
};  
//------------------------------------------------------------------------------  
class Public_Class_1:public Base//共有继承有区别与其它方式的继承,继承后的各成员不会其改变控制方式  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1仍然保持public  
            a2 = 2;//a2仍然保持protected  
            //a3=3;//错误,派生类不能操作基类的私有成员  
        }  
};  
class Public_Class_2:public Public_Class_1//以public方式继承Public_Class_1类  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1仍然保持public  
            a2 = 2;//a2仍然保持protected  
            //a3=3;//错误,由于Base类成员为私有成员,即使是上级父类是公有继承,也不能改变Base类成员的控制类型  
        }  
}; 

 

 

 

  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。