Подтвердить что ты не робот

Доступ к наследованию класса по умолчанию

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

class Base
{
    public:
    virtual void Do();
}

class Derived:Base
{
    public:
    virtual void Do();
}

int main()
{
    Derived sth;
    sth.Do(); // calls Derived::Do OK
    sth.Base::Do(); // ERROR; not calls Based::Do 
}

как видно, я хочу получить доступ к базе:: Do through Derived. Я получаю ошибку компиляции как "класс Base в недоступном", однако, когда я объявляю Derive as

class Derived: public Base

он работает нормально.

Я прочитал доступ по умолчанию для наследования public, тогда почему мне нужно явно объявить публичное наследование здесь?

4b9b3361

Ответ 1

Возможно, вы прочитали что-то неполное или вводящее в заблуждение. Процитировать Bjarne Stroustrup из "Язык программирования С++", четвертый редактор, стр. 602:

В class члены по умолчанию private; в struct, члены по умолчанию public (§16.2.4).

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

Широко распространенное соглашение состоит в том, чтобы использовать структуру только для организации чистых членов данных. Вы правильно использовали class для моделирования и реализации поведения объекта.

Ответ 2

Из стандартных документов, 11.2.2

При отсутствии спецификатора доступа для базового класса предполагается public, когда производный класс определяется с помощью class-key struct и private предполагается, когда класс определяется классом класса .

Итак, для struct по умолчанию используется public, а для class es значение по умолчанию - private...

Примеры из самих стандартных документов,

class D3 : B { / ... / }; // B private by default

struct D6 : B { / ... / }; // B public by default

Ответ 3

Уровень наследования по умолчанию (в отсутствие спецификатора доступа для базового класса) для class в С++ является закрытым. [Для struct это общедоступно]

class Derived:Base

Base конфиденциально унаследован, поэтому вы не можете сделать sth.Base::Do(); внутри main(), потому что Base::Do() является закрытым внутри Derived

Ответ 4

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

класс B: A

- это не что иное, как

класс B: частный A