Доступ к наследованию класса по умолчанию
Предположим, что у меня есть базовый и производный класс:
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, тогда почему мне нужно явно объявить публичное наследование здесь?
Ответы
Ответ 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