С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Nishen
407 / 246 / 81
Регистрация: 26.02.2015
Сообщений: 1,154
Завершенные тесты: 2
#1

Пишем свой класс, спецификатор доступа protected - C++

09.07.2015, 18:43. Просмотров 1941. Ответов 61
Метки нет (Все метки)

Всем привет!
Из книги Р. Лафоре относительно спецификатора доступа protected:
Таким образом, если вы пишете класс, который впоследствии будет использоваться как базовый класс при наследовании, то данные, к которым нужно будет иметь доступ, следует объявлять как protected.
Далее пишется следующее:
Существуют и недостатки использования спецификатора доступа protected... это делает члены, объявленные как protected, значительно менее защищенными, чем объявленные как private.
Возникает вопросы: так когда же стоит использовать protected? Как я могу знать, захочет ли кто-нибудь использовать мой класс, как базовый? И как не доиграться со спецификаторами доступа? Как быть, если я хочу использовать чужой класс, но поля класса закрыты спецификатором private?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2015, 18:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пишем свой класс, спецификатор доступа protected (C++):

Пишем свой чекер - C++
Я хочу написать свой чекер, но не знаю с чего начать? Кто знает основные принцип работы чекеров прошу объясните.

пишем свой троян с нуля - C++
Всем привет)))соглашусь, что изобретаю велосипед, но хочется сделать все своими ручками не прибегая к open source и т.п. для повышения...

Пишем свой интерпретатор языка BASIC - C++
***************** Благодаря форуму и Evg в частности интерпретатор развивается, потихоньку превращаясь в простенький интерпретатор...

Спецификатор доступа и виртуальные функции - C++
Как я понимаю, спецификатор доступа задается только в том классе, где функция объявляется виртуальной? Получается во время исполнения не...

Ключ доступа protected - C++
В каких случаях рекомендовано использовать этот ключ доступа? Если можно, то приведите примеры.:help:

protected или не protected : ) - C++
собстно не могу решить как поступить. есть абстрактный класс окошка, являющийся базовым для всех окошек. есть 3 варианта...

61
Ouroboros-SK
60 / 60 / 21
Регистрация: 08.09.2013
Сообщений: 187
Записей в блоге: 1
09.07.2015, 18:51 #2
В хороших классах предоставляется доступ к private, через методы get и set.

Добавлено через 2 минуты
т.е
C++
1
2
3
4
5
6
7
8
class A
{
public:
  type getB();
  void setB(B);
private:
  type B;
};
Добавлено через 1 минуту
А protected чаще всего лепят в абстрактных классах или в классах, которые могут быть расширены.
Как правило, при проектировании понятно, какие классы будут расширятся, а какие нет.
0
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,152
Записей в блоге: 17
09.07.2015, 19:25 #3
Цитата Сообщение от Ouroboros-SK Посмотреть сообщение
А protected чаще всего лепят в абстрактных классах или в классах, которые могут быть расширены.
В protected обычно помещают методы, а не члены класса.

Члены класса делают private как правило.
Если же вы видите класс в котором члены класса открыты то этот класс либо какой-то особенный(например не предназначенный для наследования) либо он просто так криво написан.

Добавлено через 5 минут
Цитата Сообщение от Nishen Посмотреть сообщение
Как быть, если я хочу использовать чужой класс, но поля класса закрыты спецификатором private?
Использовать доступ через предусмотренные для этого методы.
0
hoggy
6719 / 2904 / 499
Регистрация: 15.11.2014
Сообщений: 6,538
Завершенные тесты: 1
09.07.2015, 20:48 #4
Цитата Сообщение от Nishen Посмотреть сообщение
Возникает вопросы: так когда же стоит использовать protected?
в эту секцию помещается функционал,
который должен быть доступен наследникам класса.

Цитата Сообщение от Nishen Посмотреть сообщение
Как я могу знать, захочет ли кто-нибудь использовать мой класс, как базовый?
об этом думают на этапе проектирования:
зачем вообще нужен этот базовый класс?
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
09.07.2015, 20:59 #5
Цитата Сообщение от Nishen Посмотреть сообщение
Таким образом, если вы пишете класс, который впоследствии будет использоваться как базовый класс при наследовании, то данные, к которым нужно будет иметь доступ, следует объявлять как protected.
Еще одна глупость этого Лафоре. Сколько уже его ляпов цитировали здесь на форуме. Поражает непонятная популярность этого шарлатана. Охота же людям замусоривать себе мозги.
1
xEmpire
25 / 25 / 9
Регистрация: 07.12.2012
Сообщений: 169
Завершенные тесты: 1
09.07.2015, 21:03 #6
Avazart, Чем плох вариант использовать данные с областью видимости protected и переопределять область видимости на private (используя using) в наследуемом классе?
0
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,152
Записей в блоге: 17
09.07.2015, 21:04 #7
xEmpire, Пример кода?
0
hoggy
6719 / 2904 / 499
Регистрация: 15.11.2014
Сообщений: 6,538
Завершенные тесты: 1
09.07.2015, 21:05 #8
Цитата Сообщение от xEmpire Посмотреть сообщение
Чем плох вариант использовать данные с областью видимости protected и переопределять область видимости на private в наследуемом классе?
очевидно тем, что они не приватные в базовом классе.
и следовательно, код обладает всеми недостатками такого рода проектирования.
1
xEmpire
25 / 25 / 9
Регистрация: 07.12.2012
Сообщений: 169
Завершенные тесты: 1
09.07.2015, 21:14 #9
Avazart, да хоть
C++
1
2
3
4
5
6
7
8
9
class Foo {
    protected:
        int _x;
};
 
class Bar : public Foo {
    private:
        using Foo::_x;
};
Добавлено через 5 минут
hoggy, ну а если это абстрактный класс, и цели делать его интерфейсом (Pure Abstract Class) нет?
0
hoggy
6719 / 2904 / 499
Регистрация: 15.11.2014
Сообщений: 6,538
Завершенные тесты: 1
09.07.2015, 21:16 #10
Цитата Сообщение от xEmpire Посмотреть сообщение
ну а если это абстрактный класс, и цели делать его интерфейсом (Pure Abstract Class) нет?
какая разница?

вы понимаете вообще,
откуда пошла такая манера делать все данные-члены классов приватными?

во многих книгах пишут:
по хорошему все данные-члены класса должны быть приватными.

вот зачем это нужно?
0
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,152
Записей в блоге: 17
09.07.2015, 21:16 #11
Ок, зачем тогда вообще объявлять _x в классе Foo ?
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
09.07.2015, 21:17 #12
Цитата Сообщение от xEmpire Посмотреть сообщение
чем плох вариант использовать данные с областью видимости protected
Основной принцип ООП - это минимизация зависимостей. Если в базовом классе данные protected, то классы-наследники будут зависеть от реализации базового класса, что нарушает этот принцип.
Ну и согласно принципу инкапсуляции класс должен сам управлять своими данными, а тут ими будет управлять еще кто-то, т.е. инкапсуляция нарушается. В общем, все это сильно противоречит принципам ООП.
2
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,152
Записей в блоге: 17
09.07.2015, 21:20 #13
Цитата Сообщение от xEmpire Посмотреть сообщение
ну а если это абстрактный класс, и цели делать его интерфейсом (Pure Abstract Class) нет?
Ок а что дает вообще абстрактность и полиморфизм?
Одинаковый "внешний" вид/интерфейс, но возможно разное поведение (от класса к классу)
_x и вообще член класса в данном случае дает возможность варьировать поведением?
Ведь нет виртуальных членов данных? есть виртуальные методы.
0
xEmpire
25 / 25 / 9
Регистрация: 07.12.2012
Сообщений: 169
Завершенные тесты: 1
09.07.2015, 21:21 #14
Avazart, ну например у нас есть абстрактный класс, в котором помимо чистых виртуальных методах есть метод, который выполняется в наследуемых классах одинаково, следовательно проще определить переменные здесь, и реализовать данный метод здесь используя данные переменные, а в наследуемых классах переопределить уровень доступа на закрытый.
0
hoggy
6719 / 2904 / 499
Регистрация: 15.11.2014
Сообщений: 6,538
Завершенные тесты: 1
09.07.2015, 21:24 #15
Цитата Сообщение от xEmpire Посмотреть сообщение
есть метод, который выполняется в наследуемых классах одинаково, следовательно проще определить переменные здесь, и реализовать данный метод здесь используя данные переменные, а в наследуемых классах переопределить уровень доступа на закрытый.
это нормально - иметь не виртуальную функцию-член.
которая для всех работает одинаково.

только причем здесь данные-члены?
0
09.07.2015, 21:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2015, 21:24
Привет! Вот еще темы с ответами:

базовый и производный класс, в базовом объявлена переменная "protected", она недоступна по имени в производном классе! template <class T> воду мутит! - C++
Друзья! Вот код #include &lt;stdio.h&gt; template &lt;class T&gt; class otets { protected: int peremennaya; }; template &lt;class...

Свой класс в С++ - C++
Пытаюсь сделать класс массива точнее переписать код из учебника, но так как код приводится не целый а кусками то что в данный момент...

Создать свой класс - C++
сижу книжку читаю (уже пару недель), там по чуть-чуть все время про классы (в каждой главе) рассказывают, а как полностью сконструировать...

Строки свой класс - C++
Вобщем в чем проблема, нужно реализовать строковый класс начальная структура такова Str.h #include &lt;iostream&gt; class MyString ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.