По умолчанию используется частное наследование. возьмем следующий пример:
class B { };
class D: B { };
использует частное наследование по умолчанию. Это означает, что D получает все защищенные и общедоступные поля и методы, которые есть у B (если мы действительно объявили какие-либо), но не может быть преобразован в B. Следовательно, этот код не работает:
void foo(B* argument) {}
foo(new D); //not allowed
Если D публично унаследован от B, тогда D может быть преобразован в B, и этот вызов функции будет нормальным.
Второе отличие состоит в том, что все защищенные и открытые члены в B становятся частными членами в D.
What это на самом деле означает? Открытое наследование означает D IS_A B, но частное наследование означает «реализовано в терминах». Наследование D от B означает, что вы хотите воспользоваться преимуществами некоторых функций в B, но не потому, что D IS_A B или потому что существует какая-то концептуальная связь между B и D.: D
В C ++ по умолчанию наследование является частным. Однако для любого кода, использующего класс Manager, почти нет разницы, поскольку они имеют одинаковые методы.
Однако вы не сможете преобразовать объект Manager в Employee. Вы также не сможете получить доступ к переменной employee
из класса Manager.
Без этого «общедоступный» «Сотрудник» стал бы частным базовым классом «Менеджер».
Классы, объявленные с ключевым словом 'class', по умолчанию имеют свои члены закрытыми, а их базовые классы - закрытыми по умолчанию.
Классы, объявленные с ключевым словом 'struct', по умолчанию имеют свои члены общедоступными, а их базовые классы открыты по умолчанию.