Поделиться через


Доступ к спецификаторам для базовых классов

Доступность в производном классе членов базового класса и унаследованных членов определяется двумя следующими факторами.

  • Объявляется ли базовый класс производным классом с помощью спецификатора открытого доступа в заголовке-класса (описание заголовка-класса см. в подразделе "Грамматика" раздела Определение типов классов).

  • Какой доступ к членам предоставляется в базовом классе.

В следующей таблице показана взаимосвязь между этими факторами и определен доступ к членам в базовом классе.

Доступ к членам в базовом классе

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, чтобы пользователи производного класса понимали доступ к членам.

См. также

Ссылки

Управление доступом к членам