Обсудим, как написать программу учета служащих некоторой фирмы. В ней может использоваться, например, такая структура данных:
struct employee {// служащие char* name; // имя short age; // возраст short department; // отдел int salary; // оклад employee* next; // ... };
Поле next нужно для связывания в список записей о служащих одного отдела (employee). Теперь попробуем определить структуру данных для управляющего (manager):
struct manager { employee emp; // запись employee для управляющего employee* group; // подчиненный коллектив short level; // ... };
Управляющий также является служащим, поэтому запись employee хранится в члене emp объекта manager. Для человека эта общность очевидна, но для транслятора член emp ничем не отличается от других членов класса. Указатель на структуру manager (manager*) не является указателем на employee (employee*), поэтому нельзя свободно использовать один вместо другого. В частности, без специальных действий нельзя объект manager включить в список объектов типа employee. Придется либо использовать явное приведение типа manager*, либо в список записей employee включить адрес члена emp. Оба решения некрасивы и могут быть достаточно запутанными. Правильное решение состоит в том, чтобы тип manager был типом employee с некоторой дополнительной информацией:
struct manager : employee { employee* group; short level; // ... };
Класс manager является производным от employee, и, наоборот, employee является базовым классом для manager. Помимо члена group в классе manager есть члены класса employee (name, age и т.д.).
Графически отношение наследования обычно изображается в виде стрелки от производных классов к базовому:
employee ^ | manager
Обычно говорят, что производный класс наследует базовый класс, поэтому и отношение между ними называется наследованием. Иногда базовый класс называют суперклассом, а производный - подчиненным классом. Но эти термины могут вызывать недоумение, поскольку объект производного класса содержит объект своего базового класса. Вообще производный класс больше своего базового в том смысле, что в нем содержится больше данных и определено больше функций.
Имея определения employee и manager, можно создать список служащих, часть из которых является и управляющими: