彻底搞懂C++三种访问控制与继承方式
访问控制/访问权限/访问属性
c++有三种访问权限,public,protected,private,三种访问权限限制了基类自身,派生类和外部(客户)对基类内部成员的访问,见下表:
访问者\访问权限 | public | protected | private |
---|---|---|---|
基类自身 | 可见 | 可见 | 可见 |
派生类 | 可见 | 可见 | 不可见 |
外部 | 可见 | 不可见 | 不可见 |
可见代表可调用,不可见代表不可调用
派生类对基类成员的访问权限与继承方式没有任何关系,继承影响的是基类成员在派生内呈现出来的访问权限,继而影响的是外部(客户)是否可以调用该成员,关于继承见下节。
继承
同样地,c++也有三种继承方式,public,protected,private继承,下表列出了三种继承方式下基类成员访问权限在派生类呈现出的访问权限:
继承方式\访问权限 | public | protected | private |
---|---|---|---|
public继承 | public | protected | private |
protected继承 | protected | protected | private |
private继承 | private | private | private |
公有继承不改变基类的访问权限;外部可以访问基类公有成员;
保护继承将基类的公有权限改为了保护权限,其他不变;外部无法访问基类成员;
私有继承将基类的成员的访问权限全部改为了私有权限,外部无法访问基类成员;
公有继承是一种被推广的继承方式,因为公有继承展示出了对象之间is-a(是一种)的关系,派生类是一种基类,基类公有的成员,派生类对象都有且外部可以访问;私有继承展示出的不是is-a的关系,而是is-implemented-in-terms-of(根据某物实现出)关系,因为私有继承并没有继承接口,所有接口外部均不可以调用,只是实现被继承了,因为派生类内部可以调用基类的公有和保护接口,私有继承并不推荐使用,替代方案是组合和聚合方式,组合和聚合体现出has-a(有一个)的关系,和私有继承有着异曲同工之妙,只有牵扯到virtual函数的时候才会使用私有继承,所以,放弃私有继承,拥抱组合吧!