Обоснование различия в спецификаторе доступа «по умолчанию» для базового класса - PullRequest
1 голос
/ 13 декабря 2010

Я знаю, что между struct и class в C ++ мало различий.Я также понимаю причину (ы) нескольких различий.Как и этот,

  • Члены структуры являются общедоступными по умолчанию ;члены класса приватны по умолчанию .Причина, по которой члены struct public по умолчанию , состоит в том, чтобы сделать C++-struct совместимым с C-struct.И причина, по которой члены класса являются частными по умолчанию , заключается в том, чтобы ввести концепцию инкапсуляции данных (то есть применение объектно-ориентированных принципов / методов / и т.д.).*

    Что я не понимаю, так это цитирование стандарта $ 11.2 / 2 [class.access.base]

    В отсутствие спецификатора доступа для базового класса предполагается, что publicкогда производный класс объявлен как struct, и предполагается, что private - когда класс объявлен как класс.

    Каково обоснование этого поворота и анти-однородности? Зачем нужна эта разница?

    Пример из Стандарта,

    class B {  };
    class D1 : private B {  };
    class D2 : public B { };
    class D3 : B { };         //B private by default
    struct D4 : public B { };
    struct D5 : private B { };
    struct D6 : B { };        //B public by default
    class D7 : protected B { };
    struct D8 : protected B { };
    

    Здесь B - открытая база D2, D4 и D6, aчастная база D1, D3 и D5 и защищенная база D7 и D8.


    EDIT

    Некоторые из вас могут сказать, что это различие имеет смысл, учитываяДоступ по умолчанию для структуры и класса различен (разница указана в пуле выше).Но я думаю, что inherited-struct вообще несовместимо с C-struct (который не поддерживает наследование), независимо от того, как вы его получили.Хотя я могу ошибаться.Вот почему я ищу хорошие объяснения, возможно, с примерами!: -)

Ответы [ 2 ]

7 голосов
/ 13 декабря 2010

Я не уверен, почему вы думаете, что это поворот, у вас есть согласованность с дочерними объектами и объектами базового класса. Они оба общедоступны для классов, объявленных с struct, и приватны для классов, объявленных с class. Просто и легко запомнить.

1 голос
/ 13 декабря 2010

Разве это не имеет смысла, учитывая, что доступ по умолчанию для struct и class отличается?(как в первом пункте)

Если вы наследуете от структуры (которая по умолчанию является публичной), то без указания модификатора доступа вы подразумеваете публичное наследование, тогда как если вы наследуете от класса (который по умолчанию)является приватным), то без указания модификатора доступа вы подразумеваете частное наследование.

Я что-то упустил в вашем вопросе?

...