继承中的访问级别(三十七)

  

,,,,,,,,我们在上篇博客中介绍了c++中的继承,那么我们想想既然是继承了,子类是否可以直接访问父类中的私有成员呢?根据<强> :!但是根据<强> :!那么到底哪种是正确的呢?我们来编程实验下

# include  & lt; iostream>   # include  & lt; string>      using  namespace 性传播疾病;      class 父   {   ,,,int  mv;   公众:   父母,,,()   ,,,{   ,,,,,,,mv =, 100;   ,,,}   ,,,,   ,,,int 价值()   ,,,{   ,,,,,,,return  mv;   ,,,}   };      class  Child : public 父母   {   公众:   ,,,int  addValue (int  v)   ,,,{   ,,,,,,,mv =, mv  +, v;   ,,,}   };      int  main ()   {   ,,,,   ,,,return  0;   }

,,,,,,,,我们来编译下看看是否可以通过

继承中的访问级别(三十七)

,,,,,,,,编译报错了,说明我们的第二种分析是正确的。那么不是说继承可以获得父类的全部资源嘛,它的私有成员在子类中就不能被访问。接下来我们就要介绍一个概念了,在面向对象中的访问级别。那么保护关键字的意义是什么呢?。接下来我们体验下保护。

# include  & lt; iostream>   # include  & lt; string>      using  namespace 性传播疾病;      class 父   {   保护:   ,,,int  mv;   公众:   父母,,,()   ,,,{   ,,,,,,,mv =, 100;   ,,,}   ,,,,   ,,,int 价值()   ,,,{   ,,,,,,,return  mv;   ,,,}   };      class  Child : public 父母   {   公众:   ,,,int  addValue (int  v)   ,,,{   ,,,,,,,mv =, mv  +, v;   ,,,}   };      int  main ()   {   ,,,Parent  p;   ,,,,   ,,,cout  & lt; & lt;,“p.mv =,,, & lt; & lt;, p.value (), & lt; & lt;, endl;   ,,,,   ,,,Child  c;   ,,,,   ,,,cout  & lt; & lt;,“c.mv =,,, & lt; & lt;, c.value (), & lt; & lt;, endl;   ,,,,   ,,,c.addValue (50);   ,,,,   ,,,cout  & lt; & lt;,“c.mv =,,, & lt; & lt;, c.value (), & lt; & lt;, endl;   ,,,,   ,,,return  0;   }

,,,,,,,,我们来试下将私人属性换成保护,看看编译可以通过吗?

继承中的访问级别(三十七)

,,,,,,,,我们看到编译通过了,也正常运行了。那么我们在主函数中直接给p。mv和c。mv赋值为1000呢?我们看看编译结果

继承中的访问级别(三十七)

,,,,,,,,我们看到编译失败了,因为成员变量mv是受保护的,所以在外界不能直接访问。那么为什么在面向对象中需要保护呢?我们来想想现实生活中,比如小明要去医院看病。有些隐秘的病史,小明肯定不想让别人知道,但是这时必须得给医生坦白,不然没法治病哈。这时便有了保护这个需求了,这个病史不是纯私有的,但又不是暴露在大众之下的。我们面向对象的思想中,为了更完美的贴合生活,便有了保护这个关键字。那么我们在定义类时访问级别是怎样选择的呢?我们来看看下面这张表。注:表是由唐长老总结出来的!

继承中的访问级别(三十七)

,,,,,,,,关系已经很明确了,我就不多废话了。下来我们来看个示例,关系如下

继承中的访问级别(三十七)

,,,,,,,,用程序描述出来就是下面这

# include  & lt; iostream>   # include  & lt; string>   # include  & lt; sstream>      using  namespace 性传播疾病;      class 对象   {   保护:   ,,,string  mName;   ,,,string  mInfo;   公众:   ,,,()对象   ,,,{   ,,,,,,,mName =,“Object";   ,,,,,,,mInfo =,““   ,,,}   ,,,,   ,,,string 名称()   ,,,{   ,,,,,,,return  mName;   ,,,}   ,,,,   ,,,string 信息()   ,,,{   ,,,,,,,return  mInfo;   ,,,}   };      class  Point : public 对象   {   私人:   ,,,int  mX;   ,,,int 我;   公众:   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

继承中的访问级别(三十七)