首先摘抄一下谭浩强的《C++程序设计》中关于public,private和protected这三个成员访问限定符的概念性解释:
如果在类的定义中既不指定private,也不指定public,则系统就默认为是私有的。
被声明为私有的(private)成员,只能被本类中的成员函数引用,类外不能调用(友元类除外)。
被声明为公用的(public)成员,既可以被本类中的成员函数所引用,也可以被类的作用域内的其他函数引用。
用protected声明的成员称为受保护的成员,它不能被类外访问(这点与私有成员类似),但可以被派生类的成员函数访问。
其实对于我自己来说,感觉public和private的意义还是比较清楚的,简洁但不太严谨地说,在public继承的条件下,基类的public函数在子类怎样都可以被访问,基类的private函数在子类怎样都不可以被访问,那么问题来了,protected修饰的函数呢?
为了解决这个疑惑,写了个简单的小程序试了一下。程序很简单,大致如下:
class Base
{
protected:
void protectedFun()
{
cout << "Protected fun" << endl;
}
};
class Derived : public Base
{
public:
void derivedPublicFun()
{
protectedFun();
}
};
int main(int argc, char *argv[])
{
Derived derived;
derived.derivedPublicFun();
//derived.protectedFun();//Compile Error
return a.exec();
}
先解释一下,main函数里面注释掉的那句如果打开注释的话,会编译不过,提示:error: ‘void Base::protectedFun()’ is protected
从上面的结果来看,可以看到protected修饰的函数可以被子类的函数访问,但无法被子类的对象访问,这样的话,假如我是Derived类的设计者,我就可以在Derived类的代码里根据需求调用到Base类里的protectedFun()。但是如果我把Derived类设计好,实现好以后,relaese出去了,使用这个类的人就无法直接通过构造出来的Derived类的对象访问到Base类的protectedFun(),借此达到一种“protected”的机制。
举个例子,假如有个基类叫Father,代表父亲,它有个protected接口叫money(),Father有个子类叫Son,即儿子,儿子有个接口叫buyBook(),buyBook()中可以调用到Father中的money(),除了这个写好的函数以外,Son都是不能调用到Father的money()接口的,即爸爸给儿子规定好了,你只有买书来学习可以找我要钱,其他任何理由都不能找我要钱,这样就可以把爸爸的钱给“保护”起来了~
所以,如果以后有任何成员函数想只让类的设计者可以使用,就可以将其声明为protected。