Разница между частным, публичным и защищенным наследством

Существует побитовый XOR-оператор - карет (^), т. е. для:

SELECT 170 ^ 75

Результат 225.

Для логического XOR используйте ключевое слово ANY и НЕ ВСЕ, т.е.

WHERE 5 > ANY (SELECT foo) AND NOT (5 > ALL (SELECT foo))
926
задан artm 22 August 2018 в 01:52
поделиться

10 ответов

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

Я знаю три метода доступа: public , protected и private .

Пусть:

class Base {
    public:
        int publicMember;
    protected:
        int protectedMember;
    private:
        int privateMember;
};
  • Все, что известно о Базе , также знают, что База содержит publicMember .
  • Только дети (и их дети ) известно, что База содержит protectedMember .
  • Никто, кроме Base , не знает о privateMember .

By "является осведомлен о ", я имею в виду" признать существование и, таким образом, иметь возможность доступа ".

следующий:

То же самое происходит с публичным, частным и защищенным наследованием. Давайте рассмотрим класс Base и класс Child , который наследуется от Base .

  • Если наследование является общедоступным , все, что есть известно о Base и Child , также известно, что Child наследуется от Base .
  • Если наследование защищено , только Дочерний и его дочерние элементы знают, что они наследуются от Базы .
  • Если наследование является частным , никто, кроме Ребенок знает о наследовании.
1026
ответ дан 19 December 2019 в 20:21
поделиться

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

3
ответ дан 19 December 2019 в 20:21
поделиться

Резюме:

  • Личное: никто не может видеть его, кроме внутри класса
  • Защищенный: Частные + производные классы могут видеть его
  • Публичный: мир может видеть

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

7
ответ дан 19 December 2019 в 20:21
поделиться

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

class MyClass {
    private:
        int myPrivateMember;    // lol
    protected:
        int myProtectedMember;
};

Изнутри вашего расширения к этому классу ссылка на this.myPrivateMember не будет работать. Однако this.myProtectedMember будет. Значение по-прежнему инкапсулировано, поэтому, если у нас есть экземпляр этого класса с именем myObj , то myObj.myProtectedMember не будет работать, поэтому он аналогичен функции частного члена данных. .

9
ответ дан 19 December 2019 в 20:21
поделиться

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

  • public -> открытые члены базового класса будут открытыми (обычно по умолчанию)
  • protected -> открытые члены базового класса будут защищены
  • private -> открытые члены базового класса будут закрытыми

Как указывает литб, публичное наследование - это традиционное наследование, которое вы увидите в большинстве языков программирования. То есть моделирует отношения "IS-A". Частное наследование, что-то, что, как мне кажется, свойственно C ++, является отношением «РЕАЛИЗОВАНО В УСЛОВИЯХ». То есть вы хотите использовать открытый интерфейс в производном классе, но не хотите, чтобы пользователь производного класса имел доступ к этому интерфейсу. Многие утверждают, что в этом случае вы должны агрегировать базовый класс, то есть вместо того, чтобы иметь базовый класс в качестве частной базы, сделайте член производного, чтобы повторно использовать функциональность базового класса.

62
ответ дан 19 December 2019 в 20:21
поделиться

Если вы публично наследуете от другого класса, все будут знать, что вы наследуете, и вы можете использовать полиморфно кем угодно через указатель базового класса.

Если вы наследуете защищенно, только ваши дочерние классы будут может использовать вас полиморфно.

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

Что в основном символизирует знания остальных классов о ваших отношениях с родительским классом

11
ответ дан 19 December 2019 в 20:21
поделиться

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

Только члены / друзья класса могут видеть частное наследование, и только члены / друзья и производные классы могут видеть защищенное наследование.

публичное наследование

  1. Наследование IS-A. Кнопка - это окно, и везде, где необходимо окно, кнопку тоже можно передать.

     кнопка класса: открытое окно {};
    

защищено наследование

  1. Защищено реализовано в терминах. Редко полезно. Используется в boost :: compressed_pair для наследования пустых классов и экономии памяти с использованием оптимизации пустого базового класса (в приведенном ниже примере не используется шаблон, чтобы оставаться в точке):

     struct empty_pair_impl: protected empty_class_1
    {non_empty_class_2 секунда; };
    
    struct pair: private empty_pair_impl {
     non_empty_class_2 & second () {
     вернуть это-> второе;
     }
    
     empty_class_1 & first () {
    вернуть * это; // обратите внимание, мы возвращаем * this!
     }
    };
    

частное наследование

  1. Реализовано в терминах. Базовый класс используется только для реализации производного класса. Полезно с признаками и если размер имеет значение (пустые признаки, которые содержат только функции, будут использовать оптимизацию пустого базового класса). Однако часто локализация является лучшим решением. Размер строк имеет решающее значение, поэтому здесь часто встречается

     template 
    struct string: private StorageModel {
    общественность:
     void realloc () {
     // использует унаследованную функцию
     StorageModel :: realloc ();
     }
    };
    

общедоступный член

  1. Совокупная

     пара классов {
    общественность:
     Первый первый;
     Вторая секунда;
    };
    
  2. Аксессоры

     окно класса {
    общественность:
     int getWidth () const;
    };
    

protected член

  1. Обеспечение расширенного доступа для производных классов

     стек классов {
    защищено:
     вектор <элемент> c;
    };
    
    class window {
    защищено:
     void registerClass (window_descriptor w);
    };
    

частный член

  1. Сохранить детали реализации

     окно класса {
    частный:
     int width;
    };
    

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

111
ответ дан 19 December 2019 в 20:21
поделиться
class A 
{
public:
    int x;
protected:
    int y;
private:
    int z;
};

class B : public A
{
    // x is public
    // y is protected
    // z is not accessible from B
};

class C : protected A
{
    // x is protected
    // y is protected
    // z is not accessible from C
};

class D : private A    // 'private' is default for classes
{
    // x is private
    // y is private
    // z is not accessible from D
};

ВАЖНОЕ ПРИМЕЧАНИЕ. Все классы B, C и D содержат переменные x, y и z. Это просто вопрос доступа.

Об использовании защищенного и частного наследования вы можете прочитать здесь .

1400
ответ дан 19 December 2019 в 20:21
поделиться

Публичное наследование моделирует отношения IS-A. С

class B {};
class D : public B {};

каждый D является B .

Частное наследование моделирует отношения IS-IMPLEMENTED-USING (или как там это называется). С

class B {};
class D : private B {};

D является не a B , но каждый D использует свой B в своей реализации. Частное наследование всегда можно исключить, используя вместо него включение:

class B {};
class D {
  private: 
    B b_;
};

Этот D также может быть реализован с помощью B , в данном случае с использованием его b_ . Сдерживание - это менее тесная связь между типами, чем наследование, поэтому в целом ему следует предпочесть. Иногда использование включения вместо частного наследования не так удобно, как частное наследование. Часто это неубедительное оправдание лени.

Я не думаю, что кто-то знает, какие защищали модели наследования. По крайней мере, я пока не видел убедительного объяснения.

class B {};
class D {
  private: 
    B b_;
};

Этот D также может быть реализован с использованием B , в данном случае с использованием его b_ . Сдерживание - это менее тесная связь между типами, чем наследование, поэтому в целом ему следует предпочесть. Иногда использование включения вместо частного наследования не так удобно, как частное наследование. Часто это неубедительное оправдание лени.

Не думаю, что кто-то знает, какие защищали модели наследования. По крайней мере, я пока не видел убедительного объяснения.

class B {};
class D {
  private: 
    B b_;
};

Этот D также может быть реализован с использованием B , в данном случае с использованием его b_ . Сдерживание - это менее тесная связь между типами, чем наследование, поэтому в целом ему следует предпочесть. Иногда использование включения вместо частного наследования не так удобно, как частное наследование. Часто это неубедительное оправдание лени.

Не думаю, что кто-то знает, какие защищали модели наследования. По крайней мере, я пока не видел убедительного объяснения.

Иногда использование включения вместо частного наследования не так удобно, как частное наследование. Часто это неубедительное оправдание лени.

Не думаю, что кто-то знает, какие защищали модели наследования. По крайней мере, я пока не видел убедительного объяснения.

Иногда использование включения вместо частного наследования не так удобно, как частное наследование. Часто это неубедительное оправдание лени.

Не думаю, что кто-то знает, какие защищали модели наследования. По крайней мере, я пока не видел убедительного объяснения.

20
ответ дан 19 December 2019 в 20:21
поделиться

Private:

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

Публичный:

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

Защищенные:

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


Короче говоря:

private: base

protected: base + derived

public: base + derived + any other member

: base + any other member

.
6
ответ дан 19 December 2019 в 20:21
поделиться
Другие вопросы по тегам:

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