Члены парламента, не занимающие официального поста только доступны в классе, определяющем их.
Защищенные участники доступны в классе, который определяет их и в классах, которые наследовались тому классу.
Редактирование: Оба также доступны друзьями их класса, и в случае защищенных участников, друзьями их производных классов.
Редактирование 2: Используйте то, что имеет смысл в контексте Вашей проблемы. Необходимо попытаться сделать участников частными каждый раз, когда Вы можете, чтобы уменьшить связь и защитить реализацию базового класса, но если это не возможно, тогда используют защищенных участников. Проверьте C++ FAQ на лучшее понимание проблемы. Этот вопрос о защищенных переменных мог бы также помочь.
члены парламента, не занимающие официального поста только доступны из класса, защищенные участники доступны в классе и производных классах. Это - функция наследования на языках OO.
у Вас может быть частное, защищенное и общедоступное наследование в C++, который определит то, к чему производные классы могут получить доступ в иерархии наследования. C#, например, только имеет общедоступное наследование.
К защищенным участникам могут только получить доступ потомки класса, и кодом в том же модуле. К членам парламента, не занимающим официального поста может только получить доступ класс, которым они объявляются в, и кодом в том же модуле.
, Конечно, друг функции бросают это из окна, но о хорошо.
Атрибуты и методы, отмеченные как protected
, - в отличие от частных - все еще видимы в подклассах.
, Если Вы не хотите использовать или обеспечивать возможность переопределить метод в возможных подклассах, я сделал бы их private
.
Все это зависит от того, что Вы хотите сделать, и что Вы хотите, чтобы производные классы были в состоянии видеть.
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's overridden in this class
}
}
Причина, что защищенная польза MFC, состоит в том, потому что это - платформа. Вы, вероятно, хотите разделить классы MFC на подклассы, и в этом случае защищенный интерфейс необходим к методам доступа, которые не видимы к общему использованию класса.
К защищенным участникам можно получить доступ от производных классов. Частные не могут.
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
};
С точки зрения "лучшей практики", это зависит. Если существует даже слабая возможность, что кто-то мог бы хотеть получить новый класс из Вашего существующего и нуждаться в доступе к внутренним участникам, сделайте их Защищенными, не Частный. Если они являются частными, Ваш класс может стать трудным наследоваться легко.
Общественность члены класса A доступны для всех и всех.
Защищенный члены класса A не доступны за пределами кода A, но доступно от кода любого класса, полученного из A.
Частный члены класса A не доступны за пределами кода A, или от кода никакого класса, полученного из A.
Так, в конце, выбирающем между защищенным или частным, отвечает на следующие вопросы: , Сколько доверия Вы готовы поместить в программиста производного класса?
значением по умолчанию , предположите, что производному классу нельзя доверять, и делают Ваших участников частными . Если у Вас есть очень серьезное основание предоставить свободный доступ внутренностей родительского класса к его производным классам, то можно сделать их защищенными.
Уверенный смотрят на Защищенные членские Переменные вопрос. Рекомендуется использовать частный в качестве значения по умолчанию (точно так же, как C++ class
SES делает) уменьшать связь. Защищенные членские переменные являются больше всего всегда плохой идеей, защищенные функции членства могут использоваться для, например, Шаблонный шаблон Метода.