Анонимный пользователь
Дополнительно
Разница между частным, публичным и защищенным наследованием
В чем разница между наследованием public
, private
и protected
в C++? Все вопросы, которые я нашел на SO, касаются конкретных случаев.
947
15
Важное примечание: классы B, C и D содержат переменных x, y и Z. Это просто вопрос доступа.
Об использовании protected и Private наследование можно прочитать здесь.
Чтобы ответить на этот вопрос, я бы хотел сначала описать своими словами аксессоры member'ов. Если вы уже знаете это, переходите к заголовку "далее:".
Есть три аксессора, о которых я знаю:
public
,protected
иprivate
.Пусть:
Base
, также знает, чтоBase
содержитpublicMember
.Base
содержитprotectedMember
.Base
, не знает оprivateMember
.Под "известно" я подразумеваю "признавать существование и, следовательно, иметь доступ".
следующий:
То же самое происходит с наследованием public, private и protected. Рассмотрим класс
Base
и классChild
, который наследуется отBase
.public
, то все, что знает оBase
иChild
, также знает, чтоChild
наследует отBase
.protected
, толькоChild
и его дети знают, что они наследуют отBase
.private
, никто, кромеChild
, не знает о наследовании.Ограничения видимости наследование будет сделать код не в состоянии видеть, что некоторый класс наследует другой класс: неявное преобразование от производного к базовому выиграл't работа, и метод static_cast` от базового к производному выиграл'т работу.
Только члены и друзья класса могут увидеть частные наследования, и только члены/друзья и производные классы могут увидеть защищенного наследования.
общие наследования
кнопка класса : Public окно { };
охраняемых наследования
структура empty_pair_impl : защищена empty_class_1 { non_empty_class_2 второй; };
пара структуру : частная empty_pair_impl { non_empty_class_2 &ампер;второй() { вернуть это->второй; }
&ампер empty_class_1;первый() { вернуть this; // обратите внимание, мы возвращаемся это! } };
частный наследования
шаблон<StorageModel имя_типа> строки структуры : частная StorageModel { общественные: пустота realloc() { // использует унаследованные функции StorageModel::realloc(); } };
общие член
пара класса { общественные: Первый; Второй второй; };
окна класса { общественные: тип int getWidth() константный; };
охраняемых член
класса Stack { защищено: вектор<элемент> с; };
окна класса { защищено: пустота непредвиденное registerclass(window_descriptor Вт); };
частный член
окна класса { частная: инт ширина; };
Отметим, что c-стиля бросает намеренно позволяет литья производного класса к protected или Private базового класса в определенном и безопасном образе и тоже брошены в другом направлении. Этого следует избегать любой ценой, потому что он может сделать зависимый код на детали реализации, но, при необходимости, вы можете воспользоваться этой техникой.
Это связано с тем, как открытые члены базового класса открываются из производного класса.
Как отмечает litb, публичное наследование - это традиционное наследование, которое встречается в большинстве языков программирования. То есть оно моделирует отношения "IS-A". Приватное наследование, что AFAIK свойственно C++, является "ВЗАИМОДЕЙСТВИЕМ В ТЕРМИНАХ" отношений. То есть вы хотите использовать публичный интерфейс в производном классе, но не хотите, чтобы пользователь производного класса имел доступ к этому интерфейсу. Многие утверждают, что в этом случае вы должны агрегировать базовый класс, то есть вместо того, чтобы иметь базовый класс как приватную базу, сделать его членом производного класса, чтобы повторно использовать функциональность базового класса.
в Эти три ключевых слова используются в совершенно ином контексте, чтобы указать модель наследования видимости.
В этой таблице собраны все возможные комбинации компонент декларации и модель наследования, представив в результате чего доступ к компонентам для подкласса полностью определены.
![введите сюда описание изображения][1]
Приведенной выше таблице, интерпретируется следующим образом (взгляните на первую строку):
Пример:
В результате доступ к переменным
п
,п
,р
в класс суб составляет нет.В результате доступ к переменным
г
,Z
в класс суб составляет охраняемых и переменная " X " является нет.Наследование тип : объект наследуется как:
1) Открытое Наследование:
а. Частные члены базового класса доступны в производном классе.
б. Защищенные члены базового класса остаются защищенными в производном классе.
С. Открытые члены базового класса остаются открытыми и в производном классе.
Так, другие классы могут использовать открытые члены базового класса через производный объект класса.
2) Защищенное Наследование:
а. Частные члены базового класса доступны в производном классе.
б. Защищенные члены базового класса остаются защищенными в производном классе.
С. Открытые члены базового класса становятся слишком защищенными членами производного класса.
Так, другие классы могут'т использовать открытые члены базового класса через производный объект класса, но они доступны для подкласса производных.
3) Частная Наследство:
а. Частные члены базового класса доступны в производном классе.
б. Защищены & открытые члены базового класса становятся закрытыми членами производного класса.
Таким образом, ни один из членов базового класса могут быть доступны другим классам через объект производного класса, так как они являются закрытыми в производном классе. Таким образом, даже подкласса производных класс может'т получить к ним доступ.
Модели общественного наследования это-отношения. С
каждый
Д
_ это охБ
.Индивидуальные модели наследования есть-реализовано-через отношения (или что там, что'называется). С
А
Д
- это не наB
, но всеД
используетБ
в ее реализации. Частная наследования, всегда могут быть устранены при использовании содержания:Это
Д
, тоже можно реализовать с помощью "Б", в этом случае, используя егочто
. Сдерживание является менее жесткой связи между типами наследования, так что в целом он следует отдавать предпочтение. Иногда с помощью сдерживания, а не приватное наследование не так удобно, как частное наследство. Часто, что'ы отмазка для лени.Я не'т думаю, что кто-то знает, что "защищенных" моделей наследования. По крайней мере, я не'т видели никакого убедительного объяснения пока.
Если вы публично наследовать от другого класса, все знают, что вы унаследовали и может использоваться полиморфно кем-либо через базовый указатель класса.
Если вы наследуете protectedly сможете использовать вы полиморфно только вашим детям уроки.
Если вы наследуют в частном порядке, только сам сможешь исполнить методов родительского класса.
Что по сути символизирует знания остальных классов о ваших отношениях с вашими родителями класса
Защищенные данные-члены могут быть доступны любые классы, которые наследуют от класса. Члены личные данные, однако, не может. Позвольте'ы сказать, что мы имеем следующее:
Из вашего дополнения к данному классу, ссылаясь на это.myPrivateMember выиграл't работа. Тем не менее, это.myProtectedMember будет. Значение по-прежнему герметичны, поэтому если у нас есть экземпляр этого класса под названием
myObj
, затем `myObj.myProtectedMember выиграл'т работу, так он похож на закрытый элемент данных.Основываясь на этот пример для Java... я думаю, что столик стоит тысячи слов :)
Резюме:
При наследовании, вы можете (в некоторых языках) изменить тип защиты элемента данных в определенном направлении, например, из protected в public.
Частная:
Частные члены базового класса могут быть доступны только члены базового класса .
Общественные:
Открытые члены базового класса можно обращаться к членам базового класса, членами производного класса, а также члены, которые не входят в базовый класс и производный класс.
Защищено:
Защищенные члены базового класса могут быть доступны членам базового класса, а также членов его производного класса.
Короче:
частный: основание
охраняемых: основание + производные
общие: база + производные + любой другой член
Я нашла простой ответ и так думал о публикации для меня слишком в будущем.
Его от http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers ссылки/
По сути, это защита доступа к публичным и защищенным членам базового класса в производном классе. При публичном наследовании производный класс может видеть публичные и защищенные члены базового. При частном наследовании - нет. При наследовании protected производный класс и все классы, производные от него, могут их видеть.