public protected private 用法小结
一、一般类的访问控制
public: 公有的的成员:该类的对象、类的成员函数、友元可以任意访问;声明为public的成员是类的接口部分。
protected: 保护的成员:类的成员函数、友元可以访问;
private: 私有的成员: 类的成员函数、友元可以访问;实现封装最好把所有数据成员定义为private。
二、类层次结构中的访问控制
派生类访问基类(用例子描述)
class X{//基类
public: int a;
}
class Y1 : public X{};
class Y2 : protected X{}; //Y2的成员函数、友元可以转换成基类访问基类
class Y3 : private X{}; //Y3的成员函数、友元可以转换成基类访问基类
void f1(Y1 *pY1, Y2 *pY2, Y3 *pY3)
{
X *pX = pY1; //OK,X是公用基类
pY1->a = 0; //OK
pX = pY2; //错误,X是保护基类
pY2->a = 1; //Error
pX = pY3; //错误,X是私有基类
pY3->a = 2; //Error
}
void Y2::f2(Y1 *pY1, Y2 *pY2, Y3 *pY3)
{
X *pX = pY1; //OK,X是公用基类
pY1->a = 0; //OK
pX = pY2; //OK
pY2->a = 1; //OK
pX = pY3; //错误,X是私有基类
pY3->a = 2; //Error
}
void Y2::f3(Y1 *pY1, Y2 *pY2, Y3 *pY3)
{
X *pX = pY1; //OK,X是公用基类
pY1->a = 0; //OK
pX = pY2; //错误,X是保护基类
pY2->a = 1; //Error
pX = pY3; //OK
pY3->a = 2; //OK
}
三、类层次结构中成员访问类型的变化
class X{//基类
public: int a;
protected: int b;
private: int c;
}
class Y1 : public X
{
void Debug()
{
a = 1; //public不变
b = 2; //protected不变
c = 3 //Error
}
};
class Y2 : protected X
{
void Debug()
{
a = 1; //变化成了protected
b = 2; //protected保持不变
c = 3 //Error
}
};
class Y3 : private X
{
void Debug()
{
a = 1; //变化成了private
b = 2; //变化成了private
c = 3 //Error
}
};