Частные и защищенные участники: С++

Может ли кто-нибудь просветить меня относительно разницы между private и protected членами в классах?

Я понимаю, от условностей наилучшей практики, что переменные и функции, которые не называются вне класса должны быть сделаны private - но глядя на мой MFC проект, MFC, кажется, выступают за protected.

Какая разница и какую мне использовать?

Ответ 1

Частные члены доступны только в пределах класса, определяющего их.

Защищенные члены доступны в классе, который определяет их и в классах, которые наследуются от этого класса.

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

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

Ответ 2

Публичные члены класса A доступны для всех и для всех.

Защищенные члены класса A недоступны вне кода A, но доступны из кода любого класса, производного от A.

Частные члены класса A недоступны вне кода A или из кода любого класса, производного от A.

Итак, в конечном итоге выбор между защищенным или приватным отвечает на следующие вопросы: Сколько доверия вы хотите поместить в программиста производного класса?

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

Ответ 3

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

class Base {

private: 
  int MyPrivateInt;
protected: 
  int MyProtectedInt;
public:
  int MyPublicInt;
};

class Derived : Base
{
public:
  int foo1()  { return MyPrivateInt;} // Won't compile!
  int foo2()  { return MyProtectedInt;} // OK  
  int foo3()  { return MyPublicInt;} // OK
};‌‌

class Unrelated 
{
private:
  Base B;
public:
  int foo1()  { return B.MyPrivateInt;} // Won't compile!
  int foo2()  { return B.MyProtectedInt;} // Won't compile
  int foo3()  { return B.MyPublicInt;} // OK
};

С точки зрения "лучшей практики", это зависит. Если есть даже слабая вероятность того, что кто-то захочет получить новый класс из вашего существующего и ему нужен доступ к внутренним членам, сделайте их Защищенными, а не Приватными. Если они частные, ваш класс может стать трудным для наследования.

Ответ 4

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

Ответ 5

Все зависит от того, что вы хотите сделать, и того, что вы хотите, чтобы производные классы могли видеть.

class A
{
private:
    int _privInt = 0;
    int privFunc(){return 0;}
    virtual int privVirtFunc(){return 0;}
protected:
    int _protInt = 0;
    int protFunc(){return 0;}
public:
    int _publInt = 0;
    int publFunc()
    {
         return privVirtFunc();
    }
};

class B : public A
{
private:
    virtual int privVirtFunc(){return 1;}
public:
    void func()
    {
        _privInt = 1; // wont work
        _protInt = 1; // will work
        _publInt = 1; // will work
        privFunc(); // wont work
        privVirtFunc(); // wont work
        protFunc(); // will work
        publFunc(); // will return 1 since it overridden in this class
    }
}

Ответ 6

Атрибуты и методы, помеченные как protected, - в отличие от частных - все еще видны в подклассах.

Если вы не хотите использовать или предоставить возможность переопределить метод в возможных подклассах, я бы сделал их private.

Ответ 7

Обязательно рассмотрите вопрос Защищенные Member Variables. Рекомендуется использовать private по умолчанию (как и С++ class ses do) для уменьшения связи. Защищенные переменные-члены чаще всего являются плохой идеей, защищенные функции-члены могут использоваться, например. шаблон шаблона.

Ответ 8

Защищенные члены могут быть доступны только потомкам класса и кодом в том же модуле. Частным членам доступен только класс, в котором они объявлены, и кодом в том же модуле.

Конечно, функции друзей выкидывают это из окна, но хорошо.

Ответ 9

частные члены доступны только из класса, защищенные члены доступны в классе и производных классах. Это свойство наследования в языках OO.

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

Ответ 10

закрытый= доступен только материнскому (базовому классу) (т.е. только мой родитель может войти в родительскую спальню)

защищенный= доступный по материнской линии (базовый класс) и ее дочери (т.е. только мой родитель может войти в родительскую спальню, но дал разрешение сына/дочери войти в родительскую спальню)

общедоступный= доступный материнством (базовый класс), дочерью и всеми остальными (т.е. только мой родитель может войти в родительскую спальню, но это вечеринка дома - mi casa su casa)

Ответ 11

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

Ответ 12

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

Ответ 13

  • Частный: это спецификатор доступа. По умолчанию переменные экземпляра (члена) или методы класса в c++/java являются закрытыми. Во время наследования код и данные всегда наследуются, но не доступны вне класса. Мы можем объявить наши члены-данные частными, чтобы никто не мог вносить прямые изменения в наши переменные-члены, и мы можем предоставить общедоступные методы получения и установки для изменения наших частных членов. И эта концепция всегда применяется в бизнес-правилах.

  • Защищено: это также спецификатор доступа. В c++ защищенные члены доступны внутри класса и унаследованному классу, но не за его пределами. В Java защищенные члены доступны внутри класса, унаследованному классу, а также всем классам в одном пакете.

Ответ 14

Для данных участника предпочтительнее private. Члены в классах C++ по умолчанию являются private.

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

private не доступен вообще. Никто не может использовать их вне класса, и никто не может злоупотреблять ими. Даже в производных классах.

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

MFC - это оболочка C++ для Windows API, она предпочитает public и protected. Классы, сгенерированные мастером Visual Studio, имеют ужасное сочетание protected, public и private членов. Но есть некоторая логика для самих классов MFC.

Такие члены, как SetWindowText являются public поскольку вам часто требуется доступ к этим элементам.

Члены, такие как OnLButtonDown, обрабатывают уведомления, полученные окном. Они не должны быть доступны, поэтому они protected. Вы по-прежнему можете обращаться к ним в производном классе, чтобы переопределить эти функции.

Некоторые члены должны делать потоки и циклы сообщений, к ним нельзя обращаться или переопределять, поэтому они объявлены как private

В структурах C++ члены являются public по умолчанию. Структуры обычно используются только для данных, а не для методов, поэтому public объявление считается безопасным.

Ответ 15

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

  • Указатель на прямо или косвенно полученный класс
  • Ссылка на прямой или косвенно производный класс
  • Объект прямого или косвенного производного класса

Ответ 16

Личное: Доступно по функциям членов класса & функция друга или класс друга. Для класса C++ это спецификатор доступа по умолчанию.

Защищено: Доступно для функций-членов класса, функции друга или класса друга & производные классы.

  • Вы можете хранить переменную или функцию члена класса (даже typedefs или внутренние классы) как частные или защищенные в соответствии с вашими требованиями.
  • Большую часть времени вы сохраняете член класса как приватный и добавляете функции get/set для инкапсуляции. Это помогает в обслуживании кода.
  • Обычно закрытая функция используется, когда вы хотите сохранить свои открытые функции модульными или исключить повторение кода вместо записи всего кода в одну функцию. Это помогает в обслуживании кода.

Обратитесь по этой ссылке для более подробной информации.

Ответ 17

частные и защищенные модификаторы доступа являются одними и теми же, только защищенные члены базового класса могут быть доступны за пределами основного класса в дочернем (производном) классе. Это также относится к наследованию. Но с помощью частного модификатора члены базового класса могут быть доступны только в области или коде базового класса, а его функции-друзья - только '' '' '