Частные и защищенные члены - PullRequest
0 голосов
/ 12 января 2011

У меня проблемы с пониманием различия между закрытыми и защищенными членами в классе C ++. Проще говоря, в чем разница?

Ответы [ 3 ]

4 голосов
/ 12 января 2011

protected члены доступны производным классам. private участники не являются.

Обычно (чаще всего) члены должны быть либо private, либо public. Редко и необычно требуется protected член (правка) в хорошо спроектированной системе.

EDIT:

Может быть, мне стоит пояснить, почему члены protected могут быть запахом кода.

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

Другие подробно остановились на этом.

Вот что говорит Страуструп в своем тексте:

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

См. Также этот вопрос .

1 голос
/ 12 января 2011

Из C ++ FAQ :

  • Член (член данных или функция-член), объявленный в закрытом разделе класса, может быть доступен только функциям-членам и друзьямэтого класса
  • Член (член данных или функция-член), объявленный в защищенном разделе класса, может быть доступен только функциям-членам и друзьям этого класса, а также функциям-членам и друзьям производных классов
  • Член (элемент данных или функция-член), объявленный в открытом разделе класса, может быть доступен любому
1 голос
/ 12 января 2011

Защищенные участники могут получить доступ к производным классам (и друзьям).

Доступ к закрытым членам может получить только объявивший класс (или друзья).

Простой пример:

class Base
{
protected:
    int prot;

private:
    int priv;

public:
    int Prot() const { return prot; }
    int Priv() const { return priv; }
};

class Derived
{
public:
    void ShowProt() { cout << prot; }  // OK - prot is accessible because it is protected
    void ShowPriv() { cout << priv; }  // Compile Error - cannot access priv, which is private
    void ShowPriv2() { cout << Priv(); } // OK, because Priv() is public
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...