Может кто - нибудь просветить меня, чтобы разница между private
и protected
членами в классах?
Я понимаю , от условностей наилучшей практики , что переменные и функции , которые не называются вне класса должны быть сделаны private
- но глядя на мой MFC проект, MFC , кажется, пользу protected
.
Какая разница и какую мне использовать?
Публичные члены класса А доступны для всех и каждого.
Защищенные члены класса A не доступны вне кода A, но доступны из кода любого класса, производного от A.
Закрытые члены класса A не доступны вне кода A или из кода любого класса, полученного из A.
Итак, в конце концов, выбор между защищенным или частным ответит на следующие вопросы: Какое доверие вы готовы оказать программисту производного класса?
По умолчанию предположим, что производному классу нельзя доверять, и сделайте своих членов приватными . Если у вас есть очень веская причина предоставить свободный доступ внутренним классам материнского класса к производным классам, вы можете сделать их защищенными.
источник
the protected data of the base class is part of the data of the derived class.
Действительно. Разве не лучше, чтобы автор производного класса объявлял эти данные в своем классе, а не в моем? ... :-) ...The writer of the derived class is expected to handle this data properly or it is a bug.
В паттерне NVI цель состоит в том, чтобы сделать все частным, включая методы, чтобы ограничить ущерб, который создатель производного класса может нанести иерархии. Защищенные методы уже являются потенциальной проблемой. Я не убежден, что усугублять это, используя защищенное государство, - правильный подход.Защищенные члены могут быть доступны из производных классов. Частные не могут.
С точки зрения «лучшей практики», это зависит. Если есть даже слабая вероятность того, что кто-то захочет получить новый класс из вашего существующего и ему нужен доступ к внутренним членам, сделайте их Защищенными, а не Приватными. Если они частные, ваш класс может стать трудным для наследования.
источник
Причина, по которой MFC выступает за защиту, заключается в том, что она является структурой. Возможно, вы хотите создать подклассы классов MFC, и в этом случае требуется защищенный интерфейс для доступа к методам, которые не видны для общего использования класса.
источник
Все зависит от того, что вы хотите сделать, и что вы хотите, чтобы производные классы могли видеть.
источник
Атрибуты и методы, помеченные как
protected
- в отличие от частных - все еще видимы в подклассах.Если вы не хотите использовать или предоставлять возможность переопределить метод в возможных подклассах, я бы сделал их
private
.источник
Обязательно посмотрите вопрос о переменных защищенных членов . По умолчанию рекомендуется использовать private (как это
class
делают C ++ ), чтобы уменьшить связь. Защищенные переменные-члены чаще всего плохая идея, защищенные функции-члены могут использоваться, например, для шаблона Template Method.источник
Защищенные члены могут быть доступны только потомкам класса и по коду в том же модуле. Доступ к закрытым членам возможен только по классу, в котором они объявлены, и по коду в том же модуле.
Конечно функции друзей выбрасывают это в окно, ну да ладно.
источник
закрытые члены доступны только внутри класса, защищенные члены доступны в классе и производных классах. Это особенность наследования в ОО языках.
Вы можете иметь частное, защищенное и открытое наследование в C ++, которое будет определять, какие производные классы могут получить доступ в иерархии наследования. Например, C # имеет публичное наследование.
источник
личное = доступно только для корабля (базовый класс) (т.е. только мой родитель может войти в спальню моего родителя)
защищен = доступен для материнства (базовый класс) и ее дочерей (т.е. только мой родитель может войти в спальню моего родителя, но разрешил сыну / дочери пройти в спальню родителей)
public = доступно для материнства (базовый класс), дочери и всех остальных (т.е. только мой родитель может войти в спальню моих родителей, но это домашняя вечеринка - mi casa su casa)
источник
Поскольку для извлечения и обновления защищенных членов в производном классе не требуется публичной функции-члена, это повышает эффективность кода и уменьшает объем кода, который нам нужно написать. Однако программист производного класса должен знать, что он делает.
источник
private
является предпочтительным для данных участника. Члены в классах C ++ являютсяprivate
по умолчанию.public
предпочтительнее для функций-членов, хотя это вопрос мнения. По крайней мере, некоторые методы должны быть доступны.public
доступно для всех. Это наиболее гибкий и наименее безопасный вариант. Любой может использовать их, и любой может злоупотреблять ими.private
не доступен вообще. Никто не может использовать их вне класса, и никто не может злоупотреблять ими. Даже в производных классах.protected
это компромисс, потому что он может быть использован в производных классах. Когда вы выходите из класса, вы хорошо понимаете базовый класс и стараетесь не злоупотреблять этими членами.MFC - оболочка C ++ для Windows API, она предпочитает
public
иprotected
. Классы , создаваемые Visual Studio Wizard имеют уродливую смесьprotected
,public
иprivate
членов. Но есть некоторая логика для самих классов MFC.Участники, такие как
SetWindowText
,public
потому что вам часто нужно получить доступ к этим членам.Члены, такие как
OnLButtonDown
, обрабатывают уведомления, полученные окном. Они не должны быть доступны, поэтому они естьprotected
. Вы по-прежнему можете обращаться к ним в производном классе, чтобы переопределить эти функции.Некоторые члены должны делать потоки и циклы сообщений, к ним нельзя обращаться или переопределять, поэтому они объявлены как
private
В структурах C ++ члены
public
по умолчанию. Структуры обычно используются только для данных, а не для методов, поэтомуpublic
объявление считается безопасным.источник
private
по умолчанию в Visual Studio. Это такжеprivate
по умолчанию в gcc,public
по умолчанию никогда . Если я не ошибаюсь снова. Я не могу найти стандарт, на который вы ссылаетесь.Доступ к закрытому члену возможен только в том же классе, где он объявлен, а в качестве защищенного члена - в классе, где он объявлен, вместе с классами, унаследованными им
источник
Частный : это спецификатор доступа. По умолчанию переменные экземпляра (члена) или методы класса в c ++ / java являются закрытыми. Во время наследования код и данные всегда наследуются, но не доступны вне класса. Мы можем объявить наши элементы данных как частные, чтобы никто не мог вносить прямые изменения в наши переменные-члены, и мы можем предоставить общедоступные методы получения и установки для изменения наших частных членов. И эта концепция всегда применяется в бизнес-правилах.
Защищено : это также спецификатор доступа. В C ++ защищенные члены доступны внутри класса и унаследованному классу, но не за его пределами. В Java защищенные члены доступны внутри класса, унаследованному классу, а также всем классам в одном пакете.
источник
Доступ к защищенному нестатическому члену базового класса могут получить члены и друзья любых классов, производных от этого базового класса, с помощью одного из следующих:
источник
Личное: доступно для функций-членов класса и функции друга или класса друга. Для класса C ++ это спецификатор доступа по умолчанию.
Защищено: Доступно для функций-членов класса, функции-друга или класса-друга и производных классов.
Обратитесь по этой ссылке для более подробной информации.
источник
Модификаторы закрытого и защищенного доступа - это одно и то же только то, что защищенные члены базового класса могут быть доступны вне области базового класса в дочернем (производном) классе. Это также относится и к наследованию. Но с модификатором private доступ к членам базового класса возможен только в области видимости или коде базового класса, и только его дружественные функции '' ''
источник