public与protect与private的详解

首先摘抄一下谭浩强的《C++程序设计》中关于public,private和protected这三个成员访问限定符的概念性解释:

如果在类的定义中既不指定private,也不指定public,则系统就默认为是私有的。

被声明为私有的(private)成员,只能被本类中的成员函数引用,类外不能调用(友元类除外)。

被声明为公用的(public)成员,既可以被本类中的成员函数所引用,也可以被类的作用域内的其他函数引用。

用protected声明的成员称为受保护的成员,它不能被类外访问(这点与私有成员类似),但可以被派生类的成员函数访问。


其实对于我自己来说,感觉public和private的意义还是比较清楚的,简洁但不太严谨地说,在public继承的条件下,基类的public函数在子类怎样都可以被访问,基类的private函数在子类怎样都不可以被访问,那么问题来了,protected修饰的函数呢?

为了解决这个疑惑,写了个简单的小程序试了一下。程序很简单,大致如下:


   
   
  1. class Base
  2. {
  3. protected:
  4. void protectedFun()
  5. {
  6. cout << "Protected fun" << endl;
  7. }
  8. };
  9. class Derived : public Base
  10. {
  11. public:
  12. void derivedPublicFun()
  13. {
  14. protectedFun();
  15. }
  16. };
  17. int main(int argc, char *argv[])
  18. {
  19. Derived derived;
  20. derived.derivedPublicFun();
  21. //derived.protectedFun();//Compile Error
  22. return a.exec();
  23. }

先解释一下,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。

猜你喜欢

转载自blog.csdn.net/weixin_44489823/article/details/88343104