В каких случаях нам нужно защищенное наследование? - PullRequest
6 голосов
/ 01 апреля 2012

Понятно о публичном и частном наследовании, а как же защищенное? Какой-нибудь пример, когда нам действительно нужно его использовать, и это дает нам преимущество?

Ответы [ 4 ]

4 голосов
/ 01 апреля 2012

Защищенное наследие - это то, чей смысл ускользает от меня по сей день.

Это мнение Скотта Мейерса (Effective C ++, 3-е издание) о защищенном наследовании:).

Однако эта страница интересна: Эффективный C ++: не рекомендуется защищенное наследование? .

3 голосов
/ 01 апреля 2012

Идиоме base-from-member иногда требуется защищенное наследование.

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

struct foo
{
    virtual ~foo() {}

protected:
    foo(std::ostream& os)
    {
        os << "Hello !\n";
    }
};

struct bar : foo
{
    bar(const char* filename)
      : foo(file), file(filename) // Bad, file is used uninitialized
    {}

private:
    std::fstream file;
};

Но file создается после foo, и поэтому ostream, переданный foo::foo, недействителен.

Вы решаете это с помощьювспомогательный класс и частное наследование:

struct bar_base
{
    std::fstream file;

protected:
    bar_base(const char* filename) 
      : file(filename) 
    {}   

    ~bar_base() {}
};

struct bar : private bar_base, public foo
{
    bar(const char* filename)
      : bar_base(filename), foo(file)
    {}
};

Теперь bar_base создан до foo, и ostream, переданный в foo::foo, действителен.

Если вы хотите file чтобы стать защищенным членом bar, вы должны использовать защищенное наследование:

struct bar : protected bar_base, public foo { ... }
2 голосов
/ 01 апреля 2012

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

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

0 голосов
/ 01 апреля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...