派生类的访问
回顾
类中有三种属性划分
1 | class Box{ |
而前面继承的时候我们都用的public,其实其他两种也能使用。
只不过访问方式就产生变化了。
正文
1 | class Box : 属性 基类{ |
三种继承属性*三种成员属性。它的访问方式就变得复杂了。
public
1 | class Box : public 基类{ |
这个时候,就是之前学的状态。
公有都基类派生类可以访问
私有只有基类可以访问
受保护的基类可以访问、派生类只能由成员函数访问
protected
1 | class Box : protected 基类{ |
如果继承方式变成protected。访问的权限就又变了。
public就变成了protected。
然后私有还是私有。
以之前的例子:
1 | class father{ |
当grandson处于protected继承时。
实例化的对象,就只能访问sex了。
当然同时保持之前的规则,派生类中是可以访问到son的public成员的。
1 | class grandson : protected son{ |
private
1 | class father{ |
当grandson以private继承son的时候。
son的成员在grandson中就都变成了private
私有的成员我们知道只能在类中访问。
他与protected存在的差异就是当这个grandson再次被别人以public继承的时候。
基类成员都处于private状态,是不可访问的。
1 | class box : public grandson{ |
压根找不到的
继承原则大概就是这样
修改继承的访问属性
using 基类名::成员名
注意:基类中的私有成员属性是依旧无法修改的,因为本身就不可能访问
1 | class son: public father{ |
按常理来说,这种情况由grandson实例化的对象是无法访问到其中的成员的。
但是经过using修改,就可以达到效果
因为grandson是以private继承的son,其中son的public继承过来就变成private了。
我们依然可以通过using修改。
说明unsing修改成public了。
至于私有的成员,它都只能在类中访问了,即使被继承了,也还是不能访问,所以为了贯彻私有,using是改变不了private的属性成员。
你要真的想修改私有的,之前说过在public下定义一个函数,然后赋值。既然using能修改成员。
1 | class son: public father{ |
这么操作也不是不行,就是勉强了点,而且需要人注意到这个东西。
get和set不常用还容易搞混~~~
继承访问属性的使用
使用不同的属性,肯定有不同的用处
对于private和protected而言,可以更好的封装基类。
在派生类作为基础在进行派生的时候提供继承控制。
- 将保护属性为private的基类派生出来的派生类作为父类的时候,派生类继承但不能访问构建其父类的基类成员
- 将保护属性为protected的父类产生的子类作为基类的时候,派生类继承且可以访问其非私有成员。
继承访问属性的选择
因为private的成员继承之后也不能访问,所以真的有需求的时候,我们就应该提供getter/setter函数
结语
对于类的继承方式,大多情况还是用的public,其它两种保留印象