какие утверждения верны когда базовый класс наследуется по спецификатору protected

Открытое, защищенное и частное наследование на C++

В этом руководстве мы научимся использовать публичное, защищенное и частное наследование в C++ с помощью примеров.
В наследовании С++ мы можем получить дочерний класс от базового класса в разных режимах доступа. Например:

Обратите внимание на ключевое слово public в коде:

Это означает, что мы создали производный класс от базового класса в общедоступном режиме. В качестве альтернативы мы также можем создавать классы в защищенном или частном режиме.

Эти 3 ключевых слова (общедоступное, защищенное и частное) известны как спецификаторы доступа в наследовании C++.

Особенности

Публичное, защищенное и частное наследование в C++ имеют следующие особенности:

Примечание: закрытые члены базового класса недоступны для производного класса.

Пример 1: публичное наследование C++

Здесь мы получили PublicDerived из Base в общедоступном режиме.

В результате в PublicDerived:

Поскольку закрытые и защищенные члены недоступны, нам нужно создать общедоступные функции getPVT() и getProt() для доступа к ним:

Доступность в публичном наследовании

Доступность частные члены защищенные члены общественные члены
Базовый класс да да да
Производный класс Нет да да

Пример 2: защищенное наследование C++

Здесь мы получили ProtectedDerived из Base в защищенном режиме.

В результате в ProtectedDerived:

Как мы знаем, к защищенным членам нельзя получить доступ напрямую.

Доступность в защищенном наследовании

Доступность частные члены защищенные члены общественные члены
Базовый класс да да да
Производный класс Нет да Да (наследуются как защищенные переменные)

Пример 3: частное наследование на C++

Здесь мы извлекли PrivateDerived из Base в частном режиме.

В результате в PrivateDerived:

Как мы знаем, к закрытым членам нельзя получить доступ напрямую.

Источник

Урок №157. Наследование и cпецификатор доступа protected

Обновл. 27 Сен 2021 |

На предыдущих уроках мы говорили о том, как работает наследование в языке C++. Во всех наших примерах мы использовали открытое наследование.

На этом уроке мы рассмотрим детально этот тип наследования, а также два других типа: private и protected. Также поговорим о том, как эти типы наследований взаимодействуют со спецификаторами доступа для разрешения или ограничения доступа к членам.

Спецификатор доступа protected

Мы уже рассматривали спецификаторы доступа private и public, которые определяют, кто может иметь доступ к членам класса. В качестве напоминания: доступ к public-членам открыт для всех, к private-членам доступ имеют только члены того же класса, в котором находится private-член. Это означает, что дочерние классы не могут напрямую обращаться к private-членам родительского класса!

Читайте также:  Передаточное число звезд мотоцикла калькулятор

Примечание: public = «открытый», private = «закрытый», protected = «защищенный».

В языке C++ есть третий спецификатор доступа, о котором мы еще не говорили, так как он полезен только в контексте наследования. Спецификатор доступа protected открывает доступ к членам класса дружественным и дочерним классам. Доступ к protected-члену вне тела класса закрыт.

В примере, приведенном выше, вы можете видеть, что член m_protected класса Parent напрямую доступен дочернему классу Child, но доступ к нему для членов извне — закрыт.

Когда следует использовать спецификатор доступа protected?

К protected-членам родительского класса доступ открыт для членов дочернего класса, а это означает, что если вы позже измените что-либо в protected-члене (тип данных, значение и т.д.), то вам придется внести изменения как в родительский, так и во все дочерние классы. Поэтому использование спецификатора доступа protected наиболее полезно, когда вы будете наследовать только свои же классы и количество дочерних классов будет небольшое. Таким образом, если вы внесете изменения в реализацию родительского класса, и вам понадобится обновить все дочерние классы, то вы сможете сделать эти обновления сами и это не займет много времени (так как дочерних классов будет немного).

Создание private-членов предоставляет лучшую инкапсуляцию и изолирует родительские классы от изменений, вызванных дочерними классами. Но цена этому — дополнительное создание открытого или защищенного интерфейса (способа взаимодействия других объектов с классами и их членами, т.е. геттеры и сеттеры). Это дополнительная работа, которая не стоит того, если вы сами работаете со своими же классами (чужие классы не обращаются к вашему классу) и количество дочерних классов небольшое.

Типы наследований. Доступ к членам

Существует три типа наследований классов:

public;

private;

protected.

Для определения типа наследования нужно просто указать нужное ключевое слово возле наследуемого класса:

Источник

Использование спецификатора protected для наследования базового класса

Спецификатор protected можно использовать не только для придания членам класса статуса «защищенности», но и для наследования базового класса. Если базовый класс наследуется как защищенный, все его открытые и закрытые члены становятся защищенными членами производного класса. Рассмотрим пример.

Об использовании спецификаторов public, protected и private

При объявлении члена класса открытым (с использованием ключевого слова public ) к нему можно получить доступ из любой другой части программы. Если член класса объявляется закрытым (с помощью спецификатора private ), к нему могут получать доступ только члены того же класса. Более того, к закрытым членам базового класса не имеют доступа даже производные классы. Если же член класса объявляется защищенным (protected ‑членом), к нему могут получать доступ только члены того же или производных классов. Таким образом, спецификатор protected позволяет наследовать члены, но оставляет их закрытыми в рамках иерархии классов.

Читайте также:  Аккаунт это что значит простыми словами

Во всех случаях private ‑члены базового класса остаются закрытыми в рамках этого класса и не наследуются.

Наследование нескольких базовых классов

Как видно из этого примера, чтобы обеспечить наследование нескольких базовых классов, необходимо через запятую перечислить их имена в виде списка. При этом нужно указать спецификатор доступа для каждого наследуемого базового класса.

Конструкторы, деструкторы и наследование

При использовании механизма наследования обычно возникает два важных вопроса, связанных с конструкторами и деструкторами. Первый: когда вызываются конструкторы и деструкторы базового и производного классов? Второй: как можно передать параметры конструктору базового класса? Ответы на эти вопросы изложены в следующем разделе.

Когда выполняются конструкторы и деструкторы

Базовый и/или производный класс может содержать конструктор и/или деструктор. Важно понимать порядок, в котором выполняются эти функции при создании объекта производного класса и его (объекта) разрушении.

Рассмотрим короткую программу.

Конструкторы вызываются в порядке происхождения классов, а деструкторы – в обратном порядке.

Результаты вышеописанного эксперимента можно обобщить следующим образом. При создании объекта производного класса сначала вызывается конструктор базового класса, а за ним – конструктор производного класса. При разрушении объекта производного класса сначала вызывается его «родной» конструктор, а за ним – конструктор базового класса. Другими словами, конструкторы вызываются в порядке происхождения классов, а деструкторы – в обратном порядке.

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

Аналогичная логика присутствует и в том, что деструкторы выполняются в порядке, обратном порядку происхождения классов. Поскольку базовый класс лежит в основе производного класса, разрушение базового класса подразумевает разрушение производного. Следовательно, деструктор производного класса имеет смысл вызвать до того, как объект будет полностью разрушен.

При расширенной иерархии классов (т.е. в ситуации, когда производный класс становится базовым классом для еще одного производного) применяется следующее общее правило: конструкторы вызываются в порядке происхождения классов, а деструкторы – в обратном порядке. Например, при выполнении этой программы

отображаются такие результаты:

То же общее правило применяется и в ситуациях, когда производный класс наследует несколько базовых классов. Например, при выполнении этой программы

Читайте также:  Реакции ионного обмена как решать

генерируются такие результаты:

то результаты выполнения предыдущей программы были бы такими:

Дата добавления: 2018-09-22 ; просмотров: 347 ; Мы поможем в написании вашей работы!

Источник

BestProg

Перед изучением данной темы рекомендуется ознакомиться со следующей темой:

Содержание

Поиск на других ресурсах:

1. Особенности применения модификаторов доступа при наследовании классов

Общая форма задания уровня доступа к базовому класса следующая:

2. Модификатор доступа private для базового класса.
2.1. Ограничение доступа для унаследованных классов

Рисунок 1. Модификатор доступа private для класса. Ограничение доступа для класса C в иерархии классов

2.2. Ограничения доступа для экземпляров (объектов) унаследованных классов

Рисунок 2. Модификатор доступа private для класса. Нет доступа к элементу базового класса A из экземпляра производного класса B

3. Модификатор доступа protected

4. Модификатор доступа public

Рисунок 5 демонстрирует вышеуказанные правила.

Рисунок 5. Модификатор доступа public для унаследованного класса

Источник

1)Сколько указателей могут указывать на один объект в рамках функции main?
Выберите один ответ:
a. Один
b. Ну, хорошо, три
c. Два
d. Сколько угодно
e. Указатель не для этого предназначен, он указывает на переменную базовог

2)Какое ограничение на количество параметризированных конструкторов в описании класса?
Выберите один ответ:
a. На количество параметризированных конструкторов в описании класса ограничений нет.
b. В описании класса допустимы только конструкторы по умолчанию и конструктор копии.
c. Параметризированных конструкторов в описании класса не должно быть.
d. Параметризированных конструкторов может быть не более десяти.

3)Какое наименование раздела можно явно не указывать в описании класса?
Выберите один ответ:
a. protected
b. public
c. private

4)Какие утверждения верны относительно возвращаемого значения функции?
Выберите один или несколько ответов:
a. Объект возвращается с помощью обычной инструкции return.
b. Возвращаемый объект всегда имеет спецификацию const.
c. Объект может быть в качестве возвращаемого значения функций.
d. Объект не может быть в качестве возвращаемого значения метода.

5)Какие утверждения верны, когда базовый класс наследуется по спецификатору public?
Выберите один или несколько ответов:
a. Закрытые элементы базового класса становятся закрытыми в производном.
b. Защищенные элементы базового класса становятся открытыми в производном классе.
c. Закрытые элементы базового класса становятся защищенными в производном.
d. Защищенные элементы базового класса становятся защищенными в производном классе.
e. Открытые элементы базового класса становятся открытыми в производном классе.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Источник

Онлайн портал