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

Использование "Public" в объявлении производного класса?

Учитывая этот базовый класс:

class Employee
{
     char* name;
     int age;

  public:
     Employee(char* name);
     void print();
};

Что касается "общественности", какая разница между этим:

class Manager : public Employee
{
   EmployeeList employees;

   public:
     Manager(char* name, Employee* people);
     void print();
};

и это:

class Manager : Employee
{
   EmployeeList employees;

  public:
     Manager(char* name, Employee* people);
     void print();
};
4b9b3361

Ответ 1

По умолчанию используется частное наследование. возьмите этот пример:

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

использует личное наследование как свое значение по умолчанию. Это означает, что D получает все защищенные и общедоступные поля и методы, которые B имеет (если мы фактически объявляли какой-либо), но не может быть передан в B. Следовательно, этот код не выполняется:

void foo(B* argument) {}
foo(new D);                   //not allowed

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

Второе отличие состоит в том, что все защищенные и публичные члены в B становятся частными членами в D.

Что это значит? Публичное наследование означает D IS_A B, но средство частного наследования означает "реализуется в терминах". Наследование D из B означает, что вы хотите воспользоваться некоторыми функциями в B, но не потому, что D IS_A B или потому, что существует какая-либо концептуальная связь между B и D.: D

Ответ 2

Без этого "public" "Employee" станет частным базовым классом "Manager".

Классы, объявленные с ключевым словом "класс", по умолчанию имеют свои члены private и по умолчанию имеют свои базовые классы.

Классы, объявленные с ключевым словом 'struct', по умолчанию имеют свои члены, и по умолчанию их базовые классы общедоступны.

Ответ 3

В С++ наследование закрыто по умолчанию. Однако для любого кода, использующего класс Manager, похоже, почти нет разницы, поскольку они имеют одинаковые методы.

Однако вы не сможете использовать объект Manager для Работника. Вы также не сможете получить доступ к переменной employees из класса Менеджера.