最近,决定认真开始记录自己的学习之路。
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类成员的控制类型
}
};