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

265
задан leiyc 6 November 2018 в 04:45
поделиться

9 ответов

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

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

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

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

359
ответ дан jdhao 23 November 2019 в 02:26
поделиться

члены парламента, не занимающие официального поста только доступны из класса, защищенные участники доступны в классе и производных классах. Это - функция наследования на языках OO.

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

4
ответ дан PhilGriffin 23 November 2019 в 02:26
поделиться

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

, Конечно, друг функции бросают это из окна, но о хорошо.

4
ответ дан Ignacio Vazquez-Abrams 23 November 2019 в 02:26
поделиться

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

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

5
ответ дан fhe 23 November 2019 в 02:26
поделиться

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

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
    }
}
8
ответ дан Mats Fredriksson 23 November 2019 в 02:26
поделиться

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

22
ответ дан Toon Krijthe 23 November 2019 в 02:26
поделиться

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

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
};

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

60
ответ дан Flinsch 23 November 2019 в 02:26
поделиться

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

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

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

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

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

130
ответ дан paercebal 23 November 2019 в 02:26
поделиться

Уверенный смотрят на Защищенные членские Переменные вопрос. Рекомендуется использовать частный в качестве значения по умолчанию (точно так же, как C++ class SES делает) уменьшать связь. Защищенные членские переменные являются больше всего всегда плохой идеей, защищенные функции членства могут использоваться для, например, Шаблонный шаблон Метода.

5
ответ дан Community 23 November 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: