两个因素控制基类的哪些成员可在派生类中访问;这些相同的因素控制对派生类中的继承成员的访问:
无论派生类是否使用 class-head 中的 public 访问说明符来声明基类(class-head 在定义类类型的“语法”一节中有述)。
基类中对成员的访问权限如何。
下表显示了这些因素之间的交互以及如何确定基类成员访问。
基类中的成员访问
private |
protected |
Public |
---|---|---|
无论派生访问权限如何,始终不可访问 |
如果使用私有派生,则在派生类中为私有 |
如果使用私有派生,则在派生类中为私有 |
|
如果使用受保护派生,则在派生类中为受保护 |
如果使用受保护派生,则在派生类中为受保护 |
|
如果使用公有派生,则在派生类中为受保护 |
如果使用公有派生,则在派生类中为公有 |
下面的示例阐释了这一点:
// access_specifiers_for_base_classes.cpp
class BaseClass
{
public:
int PublicFunc(); // Declare a public member.
protected:
int ProtectedFunc(); // Declare a protected member.
private:
int PrivateFunc(); // Declare a private member.
};
// Declare two classes derived from BaseClass.
class DerivedClass1 : public BaseClass
{
};
class DerivedClass2 : private BaseClass
{
};
int main()
{
}
在 DerivedClass1 中,成员函数 PublicFunc 是公共成员,ProtectedFunc 是受保护成员,因为 BaseClass 是公共基类。 PrivateFunc 对于 BaseClass 是私有的,因此任何派生类都无法访问它。
在 DerivedClass2 中,函数 PublicFunc 和 ProtectedFunc 被视为私有成员,因为 BaseClass 是私有基类。 同样,PrivateFunc 对于 BaseClass 是私有的,因此任何派生类都无法访问它。
您可以声明派生类而不使用基类访问说明符。 在这种情况下,如果派生类声明使用 class 关键字,则将派生视为私有。 如果派生类声明使用 struct 关键字,则将派生视为公共。 例如,以下代码:
class Derived : Base
...
等效于:
class Derived : private Base
...
同样,以下代码:
struct Derived : Base
...
等效于:
struct Derived : public Base
...
请注意,声明为拥有私有访问权限的成员对函数或派生类不可访问,除非使用基类中的 friend 声明来声明这些函数或类。
union 类型不能有基类。
备注
当指定私有基类时,建议显式使用 private 关键字,以便让派生类的用户了解成员访问。