如果没有继承,类只有两种用户:类本身的成员和该类的用户。用户只能访问public接口,类成员和友元既可以访问public成员也可以访问private成员。
有了继承,就有了类的第三种用户:从类派生新类的程序员。类的protected部分即为派生类准备的。总的来说,提供给派生类的接口是protected成员和public成员的组合
class B
{
public:
int a,b;
public:
B();
protected:
int sum(){return a+b;}
};
class A:public B
{
float c,d;
public:
int s();
};
int A::s(){
return sum();
}
int main(){
A* derived = new A;
B base;
cout<<derived->sum()<<endl;//error
derived->a = base.sum();//error
cout<<derived->s()<<endl;
return 0;
}
可以看到,派生类对象是不可访问基类的protected成员函数的。只能用派生类成员函数访问基类protected成员,然后派生类对象能够间接访问基类protected成员,
所以,要正确理解《C++Primer(第四版)》475页中的这句话,“派生类只能通过派生类对象访问其基类的protected成员,派生类对其基类类型对象的protected成员没有特殊访问权限。”