在一个派生类中,对继承于基类的数据成员以及成员函数的访问依赖于成员访问限定符以及继承方式两者的影响。
由protected声明的成员从用户的角度看,等价于私有成员。但实际上和私有成员有一点不同,就是说保护成员可以被派生类成员函数引用。
派生类成员的访问属性,这部分主要需要解决两个问题,如下:
1. 派生类的成员函数访问继承自基类的成员
2. 基类的成员函数访问派生类的成员
对于第二个问题,基类的成员函数只能访问基类的成员,不能访问派生类的成员。
对于第一个问题,确定基类成员在派生类中的访问属性:
要考虑基类成员所声明的访问属性,
还要考虑派生类对基类的继承方式,具体分析如下:
由上表可知,对于私有成员来说,无论是何种继承方式,私有成员private都是基类私有的,外面的包括派生类都是不可以使用的;
对于公用成员以及保护成员来说:
在公用继承下,保持原有的访问属性;
在私有继承下,成为了派生类的私有成员,也就是说派生类可以使用,但是派生类的外面是不可以使用的。特别关键的是当这样的派生类又成为了基类之后,由于从其父类中继承的成员已经成为了私有成员,因此这样的数据成员是不可能继承给它自己的派生类中的;
在受保护的继承下,成为了派生类中的受保护的成员。
下面举一个例子:
class Sudent
{
public:
void show();
};
class Student1:protected Student
{
}
int main()
{
stud1.show();//由于show函数是基类中的public型的,但是派生类的继承方式是protected型的,因此这个函数在派生类中就变成了protected型的,因此不能在类的外面访问
}