Доступ к спецификаторам для базовых классов
Доступность в производном классе членов базового класса и унаследованных членов определяется двумя следующими факторами.
Объявляется ли базовый класс производным классом с помощью спецификатора открытого доступа в заголовке-класса (описание заголовка-класса см. в подразделе "Грамматика" раздела Определение типов классов).
Какой доступ к членам предоставляется в базовом классе.
В следующей таблице показана взаимосвязь между этими факторами и определен доступ к членам в базовом классе.
Доступ к членам в базовом классе
private |
protected |
Открытый |
---|---|---|
Всегда отсутствует независимо от доступа при наследовании |
Закрытый в производном классе при использовании закрытого наследования |
Закрытый в производном классе при использовании закрытого наследования |
|
Защищенный в производном классе при использовании защищенного наследования |
Защищенный в производном классе при использовании защищенного наследования |
|
Защищенный в производном классе при использовании открытого наследования |
Открытый в производном классе при использовании открытого наследования |
Это показано в приведенном ниже примере.
// 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, чтобы пользователи производного класса понимали доступ к членам.