【OOP】访问控制与继承
# 【OOP】访问控制与继承
# 访问说明符
每个类控制着其成员的访问权限,其通过访问说明符来实现。
在 C++ 中,有三种访问说明符 public
、private
、protected
。
public
:在一个类中对于用 public
修饰的成员,该类的成员、用户(类的实例对象)、派生类及友元等都可访问。
private
:在一个类中对于用 private
修饰的成员,仅该类的成员或友元可以访问,
protected
:在一个类中对于用 protected
修饰的成员,该类的成员、派生类及友元都可以访问
简单来说,也就是 public 成员对谁都可以访问,而 private 成员只有类内部的成员和友元可以访问,而 protected 在 private 的基础上给派生类提供了访问权限。
# protected
protected
类似于 public
和 private
的公有产物,被其修饰的成员有以下特点:
- 对类的用户不可见
- 可以被派生类以及友元访问
但需要注意的是,派生类及其友元只能通过派生类对象来访问这些继承而来的受保护的成员,而不能通过基类对象来访问。
# 派生列表的访问说明符
派生类对其继承而来的成员访问权限会受两者影响:
- 基类中的访问说明符
- 派生列表的访问说明符。
如果访问直接基类的成员时,派生列表的访问说明符并不会产生影响,此时只受到基类中的访问说明符限制。
但对于继承自该派生类的新类来说则不同。
通俗点来说,我们先令按权限大小对访问说明符排序,public
> protected
> private
,对于 xx 继承(公共继承、受保护继承、私有继承三者之一),我们将继承而来的成员中,由权限大于 xx 的访问说明符修饰的成员变成 xx 访问说明符修饰的成员。
例:
class Base {
public:
int x = 0;
};
class Der : protected Base {
// ......
};
在类 Der 中,其继承自基类 Base 中的公有成员 x,会变成 Der 的受保护成员。
# 默认的继承保护级别
对于 class
和 struct
定义的类,除了其默认访问说明符有区别外,对于默认的继承保护级别也是有区别的。
当我们没有显示的在派生列表中说明访问说明符时,class
默认为私有继承,而 struct
默认为公有继承。
class Base { };
struct D1 : Base { }; // 默认为公有继承
class D2 : Base { }; // 默认为私有继承
PS:定义派生类时最好显示地表明其继承关系。
# 改变个别成员的可访问性
我们可以通过 using
声明语句来改变个别成员(该成员本身需要可以访问)的可访问性。
例如派生类私有继承了某个基类,那么其继承而来的成员会变成该派生类的私有成员,但如果我们对某个继承而来的成员使用 using
声明语句,则该成员的可访问性取决于 using
声明语句之前的访问说明符。
例:
class Base {
public:
int x = 0;
};
class Der : private Base {
public:
using Base::x; // 改变可访问性为 public
};
参考书籍:《C++ Primer》