2009-10-14 1 views
21

Учитывая этот базовый класс:Использование "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(); 
}; 
+4

Используйте std :: string over char * и std :: vector над указателем на массив. – GManNickG

+4

Я не согласен. std :: string добавляет уровень накладных расходов, чтобы разрешить данные переменной длины. Вы должны учитывать ваши потребности и выбирать с умом. – sep

+2

Без хорошего знания контекста советы использовать «std :: vectors» вместо C-массивов и «std :: string» вместо C-строк имеют очень мало значения, если они есть. – AnT

ответ

3

Без этого 'общественность' «Сотрудник» станет частным базовым классом «Менеджера».

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

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

0

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

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

+0

Тип по умолчанию inheritace в C++ зависит от класса-ключа, используемого в объявлении класса. 'class' - private, 'struct' - public. – AnT

+0

Да, но OP использует класс, поэтому в этом контексте это верно. –

+2

Да, в этом контексте. Но не «в C++». «На C++», на мой взгляд, предлагает значительно более общий контекст. – AnT

31

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

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

+1

Фантастический ответ! –

+0

Perfect-just what I look for! –

+0

спасибо, для других, подобных мне, это станет понятным после прочтения этого первого: http://stackoverflow.com/a/1372858/1511337 –

Смежные вопросы